본문 바로가기

개발지/Today I learn

[0719] 자바 객체지향프로그래밍 2 (생성자, 내부클래스)

#생성자

: 객체를 생성하는 역할을 하는 클래스의 구성 요소.

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.

 

- 인스턴스를 생성하는 것은 new 키워드이다.

- 생성자는 인스턴스 변수들을 초기화하는 메서드이다.

- 생성자도 오버로딩이 가능하다. (하나의 클래스에 여러 개의 생성자가 있을 수 있다.)

public class ExampleofConstructor {
	public static void mian(String[] args) {
    	Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor("Tistory Blog");
        Constructor constructor3 = new Constructor(3.14);
     }
}

class Constructor {
    Constructor() { // 생성자 오버로딩
    	System.out.println("cs num1");
    }
    Constructor(String str) {
    	System.out.println("cs num2");
    }
    Constructor(double a) {
    	System.out.println("cs num3");
    }
}

- 메서드 오버로딩과 마찬가지로 생성자의 모양에 맞는 매개변수를 전달해주어야 한다.

- 생성자의 선언은 다음과 같이 한다.

(1) 매개변수 없는 생성자

: 클래스이름() {...}

(2) 매개변수 있는 생성자

: 클래스이름(인수1, 인수2, ...) {...}

 

#기본 생성자

: 매개변수가 없는 생성자를 의미한다.

- 모든 클래스에는 하나 이상의 생성자가 필요하다.

- 자바는 생성자가 없는 클래스에 자동으로 기본 생성자를 추가해준다.

- 자바가 자동 생성한 기본 생성자는 매개변수, 명령어를 포함하고 있지 않다.

 

#매개변수가 있는 생성자

: 매개변수를 통해 호출 시에 인스턴스를 초기화하는 데 사용된다.

public class ExampleofConstructor {
	public static void main(String[] args) {
    	WaterBottle B = new WaterBottle(스타벅스, 하늘색, 500); // 생성자의 호출
        System.out.println("나의 텀블러 브랜드는 " + B.getBrand() + "이며, 색깔은 " + B.color + " 용량은 " + B.capacity);
        // 생성자에 의해 초기화 되었는 지 확인함.
        }
    }
    
    class WaterBottle {
    	private String brand;
        private String color;
        private int capacity;
        
        public WaterBottle(String brand, String color, int capacity) {
            this.brand = brand;
            this.color = color;
            this.capacity = capacity;
        }
        public String getBrand() {
        	return brand;
        }
        public String getColor() {
        	return color;
        }
        public int getCapacity() {
        	retunr capacity;
        }
    }
}

//출력값: 나의 텀블러 브랜드는 스타벅스이며, 색깔은 하늘색 용량은 500

- 매개변수 있는 생성자를 사용할 때, 인스턴스의 생성 후 필드값을 설정과정을 생략할 수 있다.

- 매개변수가 있을 때 개수와 타임에 알맞게 생성자를 호출해주어야 한다.

 

#thisthis()

(1) this()

: 생성자를 상호 호출하기 위해 사용한다. 

즉, 자신이 속한 클래스에서 다른 생성자를 호출할 때 사용한다.

- this() 메서드는 생성자의 내부에서만 사용할 수 있다.

- this() 메서드는 생성자의 첫 줄에 위치해야 한다.

public class Constructor {
	public static void main(String[] args) {
		Example example1 = new Example(); // 인스턴스 생성
		Example example2 = new Example("pilgrim");
    }
}

class Example {
	public Example() {
		System.out.println("Example의 기본생성자");
    }
    
	public Example(String str) {
		this(); // this()를 통해 기본생성자 호출
		System.out.println(str);
    }
}
//출력값
 Example의 기본생성자
 Example의 기본생성자
 pilgrim

- Example 클래스로 인스턴스를 생성할 때, 첫 번째 생성자가 호출된다. 

- Example 클래스의 두번째 생성자로 인스턴스를 생성할 때, this()메서드를 통해 첫 번째 생성자가 호출되고,

  다음으로 두 번째 생성자가 호출된다.

 

(2)this

public class ExampleofConstructor {
	public static void main(String[] args) {
    	WaterBottle B = new WaterBottle(스타벅스, 하늘색, 500); 
        System.out.println("나의 텀블러 브랜드는 " + B.getBrand() + "이며, 색깔은 " + B.color + " 용량은 " + B.capacity);
        }
    }
    
    class WaterBottle {
    	private String brand; 
        private String color;
        private int capacity;
        
        public WaterBottle(String brand, String color, int capacity) { // 생성자의 매개변수
	    this.brand = brand; //인스턴스변수
            this.color = color; //인스턴스변수
            this.capacity = capacity; //인스턴스변수
        }
        public String getBrand() {
        	return brand;
        }
        public String getColor() {
        	return color;
        }
        public int getCapacity() {
        	retunr capacity;
        }
    }
}

- 위 코드에서 인스턴스 변수와 생성자의 매개변수가 brand, cololr, capacity가 동일하게 선언&정의되어 있다.

- 인스턴스 변수와 매개변수를 구분하기 위해서 this 키워드를 사용한다.

- this 키워드를 사용해 인스턴스의 필드명과 지역변수를 구분할 수 있다.

(인스턴스 변수와 매개변수 차이)

 

#내부 클래스

: 클래스 내에 선언된 클래스

- 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.

- 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근 가능.

- 코드의 캡슐화 증가

- 외부에서의 내부 클래스 접근 차단으로 코드의 복잡성 감소

class Outer { // 외부 클래스
	class Inner {
		// 인스턴스 내부 클래스	
	}
	
	static class StaticInner {
		// 정적 내부 클래스
	}

	void run() {
		class LocalInner {
		// 지역 내부 클래스
		}
	}
}

- 내부 클래스의 종류

종류 선언 위치  사용 가능한 변수
인스턴스 클래스 외부 클래스의 멤버변수의 선언위치
(멤버 내부 클래스)
외부 인스턴스 변수, 외부 전역 변수
정적 클래스 외부 전역 변수
지역 클래스 외부 클래스의 메서드나 초기화블록 안 외부 인스턴스 변수, 외부 전역 변수
익명 클래스 클래스의 선언과 객체의 생성을 동시에 하는
일회용 익명 클래스

(1) 인스턴스 내부 클래스

: 객체 내부에 멤버의 형태로 존재한다.

- 외부 클래스를 생성한 뒤에 사용가능하다.

- 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 사용할 수 없다.

- 외부 클래스의 모든 접근 지정자의 멤버에 접근 가능.

 

(2) 정적 내부 클래스

: 외부 클래스의 존재와 무관하게 정적 변수를 사용할 때 내부 클래스에 사용.

static  키워드를 사용한다.

 

(3) 지역 클래스

: 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스.

- 메서드 내부에서만 사용 가능하다.

- 메서드 내부에서 선언 후 바로 객체를 생성하여 사용한다.