inflearn

[인프런] 김영한의 자바 입문 강의 섹션6. 스코프, 형변환 (231231)

hail2y 2024. 1. 1. 18:48

2023년에 자바 입문 강의 다 들어놓고 싶었지만 실패했다. 휴대폰 사용시간을 줄여야지.. 줄여야지..

올해는 버리는 시간을 줄이고 코딩을 비롯한 컴퓨터 공부에 매진해 봐야겠다!

아직 입문 강의라 그런지는 모르겠지만 자바 공부도 재밌다ㅎㅎ 아직 기본 개념만 설명해 주셔서 그런 거겠지 힘을 키우자! 아자아자! (2023년의 마지막 소비도 자바 기본 강의라구욧😎)

 

12/31 섹션6. 스코프, 형변환 필기

스코프

  • 변수의 접근 가능한 범위 = 스코프

스코프(scope)라는 게 범위라는 건 알고 있지만 거꾸로 '프로그래밍 용어로서' 범위를 스코프라고 지칭한다는 건 느낌이 새롭다.

 

  • 변수는 선언한 위치에 따라 지역변수, 멤버변수(클래스변수, 인스턴스 변수)로 분류한다.

지역변수, 전역변수의 분류로 공부했었는데 멤버변수가 의미하는 건 뭔지 이후에 배워야지

 

치트키까진 아니고 팁 등장

  • 중괄호 더블 클릭 -> 코드 블럭 범위 지정
  • 메인 메소드 끝나면 프로그램 종료 -> 프로그램 끝날 때까지 생존

변수의 생존 범위와 영향이 미치는 범위를 확인한다. 

 

  • if 문 안에서 잠깐 사용하면 될 때 지역변수로서 그 안에서 선언한다. (temp)
    - main 코드블럭에 선언하면 생존 범위가 늘어나 메모리 낭비, 코드 복잡성 증가 = 머릿속에서 생각할 변수 늘어남

코드 복잡성 얘기를 가장 흥미롭게 들었다. 메인 함수에 있는 변수를 나중에 또 이용할 수 있으니까 그때 뭐를 이용할 수 있을까 하다가 후보로 그 temp 변수가 껴서 코드가 복잡해진다는 것이다. 이 얘기를 들으면서 아- 인간적이다란 생각이 들었다. 한정적으로 사용할 변수를 if 문이나 다른 함수 안에서만 사용한다는 게 놀란 게 아니라 위 이유가 신기했다. 

 

번외로 아까 다른 사람 질문에서 발견한 건데,

 

if {                                                   if {

...                                                    ...

break;                                             break;

} else {                                            }

...                                                    ...

}

 

나는 이분법으로 갈리는 것에 대해 이런 식으로 if, else로 딱 구분해 놓는 게 깔끔한 코드라고 생각했다. 근데 사고의 흐름 상 코드를 읽을 때 if만 있을 때보다 조건이 참일 때와 거짓일 때를 구분지어 생각한다고 봐서 조금 더 파악하기 수월한 전자의 방식으로 개발을 한다고 했다. 이게 보편적으로 이루어지는 방식인지는 확언할 수 없지만 꽤 충격이었다. 

 

  • 꿀팁: navigation bar - ctrl n
  • ctrl e - 기존에 실행했던 파일들이 나오고 바로 enter 치면 직전의 것으로 돌아간다. 
  • while문 for 문을 스코프 관점으로도 비교했을 때 for문이 구조적으로 깔끔하다.

형변환

  • int < long < double

자바는 같은 타입끼리 대입이 가능하고 다르면 형변환을 거친다. 

 

  • 작은 범위의 수를 큰 범위에다 옮길 때는 자동 형변환,
    큰 범위의 수를 작은 범위로 옮길 때는 명시적 형변환이 일어난다.

묵시적이랑 명시적이랑 방법은 똑같고 후자의 경우는 소수점을 버리고 정수로만 보고 싶을 때 사용할 수 있다.

소수점 버림은 생각보다 손실이 치명적이었다. 뭐든지 돈으로 예를 들면 한방에 이해가 된다(100억>21억)

 

  • 형변환 한다고 해서 변수 자체의 타입이 변경되는 게 아니라 값을 불러와서 형변환 시키는 것이다.
  • 자바에서 변수 값을 변경하는 경우는 대입 연산자를 쓸 때만이다.

그리고 리터럴의 기본 타입이 int형이고 범위를 넘어가는 수에 대해선(long) L을 붙여준다! 기억하자!

 

  • 오버플로우는 발생하는 것 자체가 문제다. 오버플로우 숫자 연구하지 말고 문제 해결에 초점을 맞추자
    이전에 시도한 형변환 하지 말고 변수 자체를 더 큰 범위의 타입으로 바꿔라

대원칙 세워두고 공부하면 편하다 -- 숲을 잘 봐야 나무도 잘 보이겠지 앞으로는 이렇게 하자😥 

형변환 대원칙

  1. 같은 타입끼리 계산하면 같은 타입의 결과를 낸다.
  2. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다. 

여러 프로그래밍 언어로 연산자를 공부할 때면 / 가 제일 헷갈린다;; 기본연산자임에도 불구하고 정수 나누기 연산자인지, 소수점까지 반환되는 연산자인지... 파이썬이 소수점까지 반환해줘서 그래!!!!! 

- 파이썬 3 / 2 = 1.5

- c        3 / 2 = 1

- java    3 / 2 = 1

이건 진짜 나를 위해...

 

  •  / 이라고 해서 무조건 정수 나누기의 결과로 나오지 않는다는 걸 명심해야 한다. 

double a = 3.0 / 2 는 double / int니까 큰 범위의 타입으로 자동 형변환 되어서 double / double, 결과적으로 1.5가 나온다. double b = (double) 3 / 2는 마찬가지로 double / double 되어서 1.5가 나온다.

단, double c = 3 / 2는 double c = (double) 1, 이 과정을 거치니까 1.0이 나온다.

 

3 / 2 할 때 소수까지 구하고 싶다면

1. X.0으로 쓴다.

2. (double)을 명시적으로 쓴다. 

 

제약을 주는 것의 끝판왕은 타입이다. int에 String을 못 넣게 하니까

 

이전 글들보다 이번에 쓴 게 더 깔끔해 보이긴 한데 시간 좀 잡아먹은 거 같아서 다음 거부턴 빠르게 써보려고 해야겠다. 그리고 이 글들이 온전히 나를 위한 거긴 한데 공개글이다 보니 다른 사람도 살짝 의식하게 되는 것 같아서 큼큼.. 초심을 찾아야겠다!!!!!!!! 

 

--끝--