본문 바로가기
얄코의 제대로 파는 자바/섹션6 클래스 더 알아보기

블록과 스코프

by 백엔드 개발자 2024. 3. 24.

 

블록 및 스코프 설명


  • 0개 이상의 문을 묶은 단위를 블록이라고 한다.
  • 새로운 스코프를 생성한다.
  • 스코프 : 변수가 사용될 수 있는 범위를 말한다.

 

  • 블록안의 변수의 스코프는 블록바깥을 벗어나지 못하고 있다.

 

 

외부의 변수는 내부 블록에서 사용가능하나, 블록내의 변수는 외부에서 사용 불가능.

String x = "전국구 보스";

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

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

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

 

 

 

 

메서드와 클래스의 스코프


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); // ⚠️
    }
}

 

  • a는 인스턴스 필드라서 메인 메서드(static이 붙어있는 클래스메서드)에서 바로 사용 불가능.
  • x는 다른 클래스에서 선언된 변수라서 해당 클래스에서는 사용 불가능. 클래스내 필드 스코프는 해당 클래스 안이라서.
  • 메서드 안에서 생성된 변수는 스코프가 해당 메서드 안이다.
  • 단 클래스에서 선언된 필드들은 메서드 안에서도 사용가능.

 

 

 

스코프와 변수 재선언에 관하여


				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
        );
    }
}
  • 클래스필드 king과 메서드내 필드 king은 엄연히 다른 영역이라서 재선언이 아니라 별개의 선언으로 본다.
  •  

 

 

 

 

 

'얄코의 제대로 파는 자바 > 섹션6 클래스 더 알아보기' 카테고리의 다른 글

열거형  (0) 2024.04.17
메인 메소드  (0) 2024.04.15
익명클래스  (0) 2024.04.08
내부클래스  (0) 2024.04.07
패키지  (0) 2024.04.02