[인프런] 김영한의 자바 입문 - 7

김다은·2024년 11월 20일

JAVA

목록 보기
11/14
post-thumbnail

이 게시글은 인프런 "김영한의 자바 입문" 강의를 바탕으로 작성했습니다:)

스코프, 형변환

스코프1 - 지역 변수와 스코프

변수의 접근 가능한 범위를 스코프(Scope)라 한다. 참고로 Scope를 번역하면 범위라는 뜻

스코프2 - 스코프 존재 이유

Scope3_1

package scope;
public class Scope3_1 {
public static void main(String[] args) {
int m = 10;
int temp = 0;
if (m > 0) {
           temp 
= m * 2;
System.out.println("temp = " + temp);
   }
}

조건이 맞으면 변수 m의 값을 2배 증가해서 출력하는 코드이다. 여기서 2배 증가한 값을 저장해두기 위해 임시 변수 temp를 사용했다.
그런데 이 코드는 좋은 코드라고 보기는 어렵다. 왜냐하면 임시 변수 tempif 조건이 만족할 때 임시로 잠깐 사용하는 변수이다. 그런데 임시 변수 tempmain() 코드 블록에 선언되어 있다.
이렇게 되면 다음과 같은 문제가 발생한다

  • 비효율적인 메모리 사용 : tempif 코드 블록에서만 필요하지만, main() 코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다.
    만약 if 코드 블록 안에 temp 를 선언했다면 자바를 구현하는 곳에서 if 코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.
  • 코드 복잡성 증가 : 좋은 코드는 군더더기 없는 단순한 코드이다. 누군가 이 코드를 유지보수 할 때 m은 물론이고 temp까지 계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다.

Scope3_2 - 개선한 코드

package scope;
 public class Scope3_2 {
 public static void main(String[] args) {
 int m = 10;
 if (m > 0) {
 int temp = m * 2;
 System.out.println("temp = " + temp);
        }
 System.out.println("m = " + m);
    }
 }

tempif코드 블록 안에서 선언했다. 이제 tempif 코드 블록 안으로 스코프가 줄어든다. 덕분에 temp 메모리를 빨리 제거해서 메모리를 효율적으로 사용하고, temp 변수를 생각해야 하는 범위를 줄여서 더 유지보수 하기 좋은 코드가 됐다.

정리

  • 변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다. 변수의 스코프는 꼭 필요한 곳으로 한정해서 사용하자. 메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있다.
  • 좋은 프로그램은 적절한 제약이 있는 프로그램이다.

형변환

작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.

예) intlongdouble

큰 범위에서 작은 범위는 다음과 같은 문제가 발생할 수 있다.

  • 소수점 버림
  • 오버플로우

자동 형변환

작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 직접 형변환을 하지 않아도 된다. 이런 과정이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형변환이라 한다.

명시적 형변환

큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다

형변환은 다음과 같이 변경하고 싶은 데이터 타입을 (int)와 같이 괄호를사용해서 명시적으로 입력하면 된다.
intValue = (int) doubleValue; //형변환
이것을 형(타입)을 바꾼다고 해서 형변환이라 한다. 영어로는 캐스팅이라 한다. 그리고 개발자가 직접 형변환 코드를 입력한다고 해서 명시적 형변환이라 한다.

정리

  • intlongdouble
  • 작은 범위에서 큰 범위로는 대입할 수 있다.
    • 이것을 묵시적 형변환 또는 자동 형변환이라 함
  • 큰 범위에서 작은 범위의 대입은 다음과 같은 문제가 발생할 수 있다. 이때는 명시적 형변환을 사용해야 한다.
    • 소수점 버림
    • 오버플로우
  • 연산과 형변환
    • 같은 타입은 같은 결과를 낸다
    • 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
profile
꾸준함으로 성취하는 개발자

0개의 댓글