java

2022.09.05 java 생성자, 내부 클래스

Han_5ung 2022. 9. 7. 00:08

생성자(Constructor)

 - 인스턴스 변수를 원하는 값으로 초기화할 수 있는 메서드

 

특징

  1. 생성자의 이름은 반드시 클래스의 이름과 같아야 한다
  2. 리턴 타입이 없으나  void는 아님
  3. 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
  4. 생성자 오버로딩 가능

생성자 선언

클래스명(){	//매개변수가 없는 생성자
	...바디...
}

클래스명(매개변수){	//매개변수가 있는 생성자
	...바디...
}

ex)

Class Person{
    Person(){
    	System.out.println("사람입니다");	
    }
    Person(String name){
    	System.out.println("이름 : " + name);
    }
    Person(String job, int age){
    	System.out.println("직업 : " + job + "나이 : " + age);
    }
}

this & this()

this

  • 인스턴스가 자기 자신을 참조함
  • this 참조 변수를 사용하여 인스턴스 변수에 접근할 수 있음
class Person{
    String name;	//인스턴스 변수
    String job;
    int age;
    
    public Person(String name; String job; int age){	//매개변수
    	this.name = name;	
        this.job = job;
        this.age = age;
    }
}
  • this.인스턴스 변수 = 매개변수;
  • 외부에서 받아온 매개변수값이 인스턴스 변수에 할당

this()

  • 자신이 속한 클래스에서 다른 생성자를 호출
  • 생성자 내부에서만 사용 가능
  • 반드시 생성자의 첫 줄에 위치
class Person{
    String name;	//펭귄
    String job;	//백수
    int age;	//100
    
    public Person(){
    	this("펭귄","백수",100); //아래 생성자 호출
    }
    
    public Person(String name; String job; int age){	
    	this.name = name;	
        this.job = job;
        this.age = age;
    }
}
  • 인스턴스 변수 name, job, age에 각각 펭귄, 백수, 100이라는 값이 할당됨

내부 클래스(Inner Class)

 - 클래스 내부에 선언된 또 다른 클래스

 

장점

  • 내부에서 외부 클래스 멤버에 손쉽게 접근할 수 있음
  • 코드의 캡슐화
  • 코드의 복잡성을 줄일 수 있음

종류

  • 인스턴스 내부 클래스
  • 정적 내부 클래스
  • 지역 내부 클래스
  • 익명 내부 클래스

인스턴스 내부 클래스

class Outer{ //외부 클래스
	
    
    class Inner{	//내부 클래스
    
    }
}
  • 반드시 외부 클래스를 생성한 이후에 사용
  • 외부 클래스의 접근 지정자의 멤버에 접근 가능

정적 내부 클래스

  • 주로 외부 클래스의 클래스 메서드로 사용
  • static 키워드 사용
class Outer{
    private int num = 3;	//사용 불가
    private static int sNum = 4;	//사용 가능
    
    void getPrint(){
    	System.out.println("인스턴스 메서드");	//사용 불가
    }
    
    static void getPrint(){
    	System.out.println("정적 메서드");	//사용 가능
    }
        
    
    static class Inner{ //정적 내부 클래스
    	void test{
        	System.out.println("sNum : " + sNum);
            getPrintStatic();	//num과 getPrint()는 정적 멤버가 아니라서 사용 불가능
    }
}
  • static 변수, 메서드 사용 가능

지역 내부 클래스

  • 외부 클래스의 메서드나 초기화 블록에 선언된 클래스
  • 선언된 블록 내부에서만 사용 가능
class Outer{

    void test(){	//메서드
    	...바디...
    	
        class LocalInner{ //지역 내부 클래스
        	void getPrint(){
            	System.out.println("지역 내부 클래스입니다")
            }
        }
    }
    
    LocalInner localInner = new LocalInner();
    localInner.getPrint();	//호출
}

//출력값
지역 내부 클래스입니다