ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - Object3
    개발언어/JAVA 2023. 10. 16. 17:45

    💡tip) 접근제어자

    접근 제어자 설명
    public 외부 클래스 어디에서나 접근할 수 있다.
    protected 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고 그 외 클래스에서는 접근할 수 없다.
    아무것도 없는 경우 default이며 같은 패키지 내부에서만 접근할 수 있다. 
    private 같은 클래스 내부에서만 접근할 수 있다.

    this 예약어

    자신의 메모리를 가리키는 this

    this는 간단히 설명하면 생성된 인스턴스 스스로를 가리키는 예약어이다. 

    package studythis;
    
    class BirthDay{
       int day;
       int month;
       int year;
       
       // 태어난 연도를 지정하는 메서드
       public void setYear(int year){
       // mian()의 bDay.year=year;와 같다.
       	this.year = year;
       }
       
       // this 출력 메서드
       public void printThis(){
       // mian()의 System.out.println(bDay);와 같다.
       	System.out.ptintln(this);
       }
       
       public class ThisExample{
       	public static void main(String[] args){
        	BrithDay bDay = new BirthDay();
            //태어난 연도를 2001으로 지정
            bDay.setYear(2001); 
            //참조 변수 출력
            System.out.println(bDay);    //studythis.BirthDay@422d716d
            //this 출력 메서드 호출
            bDay.pirntThis();            //studythis.BirthDay@422d716d
        }
       }
       
    }

    ⭐️인스턴스가 생성된 동적 메모리(힙) 주소는 실제 주소가 아닌 자바 가상 머신이 생성한 주소이다.

     

    참조 변수는 힙메모리에 생성된 인스턴스의 주소값(참조 값)을 가르키며, 참조 변수를 출력하면 '클래스 이름@메모리 주소'문자열 값이 나온다. 출력 결과를 bDay.printThis()메서드를 호출하여 출력한 this값이 참조 변수 bDay를 출력한 값과 같다. 즉 클래스가 작성된 코드에서 사용하는 this는 생성된 인스턴스 자신을 가리키는 역할을 한다. 따라서 this.year = year; 코드로 참조하면  도정 메모리에 생성된 인스턴스의 year 변수 위치를 가리키고 그 위치에 매개변수 값을 넣어 주는 것이다. 

     

    💡 tip) 프로그램 구성의 주의

    위 예시 코드에서 BirthDay 클래스는 객체를 코드로 만든 클래스이고, ThisExample 클래스는 this 출력 값의 의미를 알기 위해 mian() 함수를 포함하여 만든 테스트용 클래스이다. 보통 자바 파일에 하나의 클래스가 있는 경우가 대부분이지만, 이번 예제 처럼 하나의 파일에 클래스가 여러 개 존재할 수도 있다. 이때 public 클래스는 하나 뿐이며 public 클래스와 자바 파일 이름은 같아야 한다. 예제를 보면 main() 함수를 포함한 클래스가 ThisExample이므로 이 클래스를 public으로 선언했고, 자바파일에 이름도 ThisEcample이 되어야 한다.

     

    생성자에서 다른 생성자를 호출하는 this

    package studythis;
    
    class Person{
       String name;
       int age;
       
       Person(){
       // this를 사용해서 바로 및의 정의된 Person(String,int) 생성자 호출
       	this("이름 없음",1);
       }
       
       Person(String name, int age){
       	this.name = name;
        this.age = age;
       }
       
      public class CallAnotherConst{
      	public static void main(String[] args){
        	Person noName = new Person();
            System.out.println(noName.name); //이름 없음
            System.out.println(noName.age); //1
        }
      }
    }

    클래스에 생성자가 여러개 있을때 어떤 생성자에서 다른 생성자를 호출하는 경우가 종종있다. 이때 this를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있다.

     

    this로 다른 생성자를 호출할 때 주의할 점

    Person(){
       this.name = "noname";
       //오류 발생
       ⛔️this("이름 없음",1); // Person(String, int)생성자 호출
    }

    this로 생성자안에서 다른 생성자를 호출할 때 주의할 점이 있다. this를 사용하여 생성자를 호출하는 토드 이전에 다른 코드를 넣을수 없다. 만약 다른 코드를 넣으려고 하면 오류 메시지가 나타난다. 왜냐하면 생성자는 클래스가 생성될 때 호출되므로 클래스 생서이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생할 수 있다. 즉 위 코드에서는 디폴트 생성자에서 생성이 완료외는 것이 아니라 this를 사용해 다른 생성자를 호출하므로, 이때는 this를 활용한 문자이 가장 먼저와야 한다.

     

    this를 사용하여 주소 값 반환하기

    package studythis;
    
    class Person{
     String name;
     int age;
     
     Person(){
    	this("이름 없음",1)
     }
     
     Person(String name, int age){
     	this.name = name;
        this.age = age;
     }
     
     //반환형은 클래스형
     Person returnItSelf(){
     	return this; //this 반환
     }
     
     public class CallAnotherConst{
      public static void main(String[] args){
      	Person noName = new Person();
        System.out.println(noName.name); //이름없음
        System.out.println(noName.age);  //1
        
        //this 값을 참조변수 이름은 다르고 참조 타입은 같은 참조변수에 대입
        Person p = noName.returnItSelf();
        //noName.returnItSelf()의 반환 값 출력
        System.out.println(p);          //studythis.Person@17f56521
        System.out.println(noName);     //studythis.Person@17f56521
      }
     }
     
    }

    this를 사용하여 클래스 자신의 주소 값을 반환할 수 있다. 인스턴스 주소 값을 반환할 때는 this를 사용하고 반환형은 클래스 자신인 참조 타입을 사용한다.

     

    this를 반환하는 메서드를 사용하는 일이 흔하지는 않지만, 클래스 자료형과 상관없이 클래스내에서 this를 사용하면 자신의 참조 주소값을 반환할 수 있다.

     

    [출저 - Do it! 자바 프로그래밍 입문 , 박은종]

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

    댓글

Designed by Tistory.