새소식

Java/제대로 파는 자바

[제대로 파는 자바 (Java) - by 얄코] 블록과 스코프

  • -

해당 게시물은 [제대로 파는 자바 (Java) - by 얄코]를 수강한 내용을 바탕으로 작성하였습니다.

 

 

 

 

 

블록 block

  • 0개 이상의 문 statement 들을 묶은 단위
  • 제어문, 함수, 클래스 등에 사용
  • 새로운 스코프 생성
public class Ex01 {
    public static void main(String[] args) {
        //  💡 { } 로 블록 생성
        {
            int x = 1;
            System.out.println(x);
        }

        
        
        

        {
            int intNum = 123;
            String str = "블록 밖은 위험해";
        }

        //  💡 블록 안에서 선언된 것은 밖에서 사용 불가
        intNum = 234;
        System.out.println(str);

        
        
        

        String x = "전국구 보스";

        {
            String y = "동네 양아치";

            //  💡 블록 안쪽에서는 바깥의 것 사용 가능
            System.out.println(x);
            System.out.println(y);
        }

        System.out.println(x);
        System.out.println(y); // ⚠️ 불가

        
        
        

        int z = 1;

        for (int i = 0; i < 5; i++) {
            System.out.println(z + i);
        }

        System.out.println(i); // ⚠️ 불가
    }

 

 

 

 

 

 

메소드와 클래스의 스코프

 

public class Ex02 {
    public static void main(String[] args) {
//        System.out.println(a); // ⚠️ 클래스 메소드에서 인스턴스 필드 사용 불가
    }

//    private String y = x; // ⚠️ 클래스 내 필드의 스코프 : 해당 클래스 안
    private int a = 1;
    private int b = a + 1;
//    private int c = d + 1; // ⚠️ 메소드 내 변수의 스코프 : 해당 메소드 안

    public void func1 () {
        System.out.println(a + b);
        int d = 2;
    }

    public void func2 () {
//        System.out.println(d); // ⚠️
    }
}

 

 

 

 

자바에서는 바깥의 변수 재선언 불가

  • 자바스크립트 등의 언어와 달리…
public class Ex03 {
    public static void main(String[] args) {
        String str = "바깥쪽";
        {
            String str = "안쪽"; // ⚠️ 재선언 불가
        }

        while (true) {
            String str = "안쪽"; // ⚠️ 재선언 불가
        }
    }
}

 

 

 

public class Ex04 {

    public static void main(String[] args) {
        new Ex04().printKings();
    }

    String king = "사자";  //클래스의 필드

    void printKings () {
        String king = "여우"; // 💡 메소드 안에 선언된 변수

        //  ⭐️ 인스턴스의 필드는 다른 영역으로 간주
        System.out.printf(
                "인스턴스의 왕은 %s, 블록의 왕은 %s%n",
                this.king, king
        );
    }
}

여우 라인을 지우고 실행해보면 this.king 뿐만 아니라 king도 사자

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.