반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

지역 클래스 (Local Classes)

로컬(지역) 클래스(Local classes)는 중괄호{ } 사이에 0개 또는 그 이상의 구문의 그룹이 있는 블록에 정의되어진 클래스다. 일반적으로 메서드의 몸체에서 지역변수가 정의된 걸 찾을 수 있다.

에워싼 클래스 멤버에 접근하기(Accessing Members of an Enclosing Class)

지역 클래스는 자신을 에워싼 클래스의 멤버들에 대한 접근권이 있다. 앞 포스팅의 예제에 PhoneNumber 생성자는 LocalClassExample.regularExpression 멤버에 접근한다.

게다가, 지역 클래스는 지역 변수에 대한 접근권이 있다. 그러나 지역 클래스는 final 선언된 지역 변수만 접근할 수 있다. 지역 클래스가 지역 변수 또는 에워싼 블록의 파라미터에 접근할 때 변수나 파라미터를 점유하게 된다. 예를 들면 PhoneNumber 생성자는 final로 선언되었기에 지역 변수인 numberLength에 접근할 수 있다. numberLength는 점유된 변수이다.

그러나 JavaSE8에서는 지역 클래스는 final 또는 사실상 final의 에워싼 클래스의 변수와 파라미터에 접근할 수 있다. 사실상 final(effectively final)는 초기화 된 이후 절대 변경되지 않는 값의 변수와 파라미터이다. 예를 들어 가정해 보면 변수인 numberLengthfinal로 선언되지 않았다. 그리고 PhoneNumber의 생성자에서 전화 번호 자리수를 7로 변경하게 하는 하이라이트 된 할당 구문을 추가한다.

    PhoneNumber(String phoneNumber){

       numberLength = 7;

       String currentNumber = phoneNumber.replaceAll(regularExpression, “”);

       If (currentNumber.length() == numberLength)

          formattedPhoneNumber = currentNumber;

       else

          formattedPhoneNumber = null;

      }

이 할당 구문 때문에 더 이상 변수 numberLength는 사실상 final이 아니다. 이 결과로 자바 컴파일러는 내부 클래스 PhoneNumber가 변수 numberLength에 접근을 시도하면 내부 클래스는 반드시 final 또는 사실상 final로 선언 되어야 지역 변수가 참조되어 진다.” 라는 오류 메시지를 뿌린다.

 

 

Java SE 8에서 메서드 내에 지역 클래스를 선언하면 그 메서드의 파라미터에 접근할 수 있다. 예를 들어 아래 예제를 보자

    public void printOriginalNumbers(){

       System.out.println(“Original numbers are “ + phoneNumber1 + “ and “ + phoneNumber2);

    }

메서드 printOriginalNumbers validatePhoneNumber의 파리미터인 phoneNumber1phoneNumber2에 접근한다.

 

반응형
반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

지역 클래스 (Local Classes)

로컬(지역) 클래스(Local classes)는 중괄호{ } 사이에 0개 또는 그 이상의 구문의 그룹이 있는 블록에 정의된 클래스다. 일반적으로 메서드의 몸체에서 지역변수가 정의된 걸 찾을 수 있다.

지역 클래스 선언 (Declaring Local Classes)

어떤 블록 안에서 지역 클래스를 선언할 수 있다. 예를 들어 for루프나 if절의 메서드 몸체 내에서 지역 클래스를 선언할 수 있다는 의미다.

아래 예제는 지역 클래스의 샘플 프로그램이다. 2개의 전화번호를 체크하는데 지역 클래스인 PhomeNumber는 메서드 validatePhoneNumber내에 정의되어 있다.

   public class LocalClassExample {

       static String regularExpression = "[^0-9]";

       public static void validatePhoneNumber(String phoneNumber1, String phoneNumber2)   {

          final int numberLength = 10;

          class PhoneNumber {

             String formattedPhoneNumber = null;

             PhoneNumber(String phoneNumber){

                String currentNumber = phoneNumber.replaceAll(regularExpression, "");

                if(currentNumber.length() == numberLength)

                   formattedPhoneNumber = currentNumber;

                else

                   formattedPhoneNumber = null;

               }

               public String getNumber() {

                  return formattedPhoneNumber;

               }

            }

            PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1);

            PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2);

            if (myNumber1.getNumber() == null)

               System.out.println("First number is invalid");

           else

              System.out.println("First number is " + myNumber1.getNumber());

          if (myNumber2.getNumber() == null)

             System.out.println("Second number is invalid");

          else

             System.out.println("Second number is " + myNumber2.getNumber());

          }

       public static void main(String[] args) {

         validatePhoneNumber("123-123-1234", "234-0009");

       }

   }

 

 

위 예제는 입력한 전화 번호에서 0부터 9외의 모든 문자들을 먼저 제거하는 것으로 전화번호인지를 입증한다. 이 후 정확하게 10개의 숫자로 이루어진 전화번호인지 체크한다. 위 예제의 결과는 다음과 같다.

First number is 1231231234

Second number is invalid

 

 

반응형