The A :

728x90
반응형

Today I Lean

객체지향 _ 생성자와 이너클래스

 

 

 

 

 

 

학습목표 및 개념정리

# 생성자 (Constructor)

- 생성자의 핵심 개념과 기본 문법을 이해하고 사용할 수 있다.

- 생성자가 메서드와 구분되는 두 가지 차이를 이해하고 설명할 수 있다.

- 메서드 오버로딩이 생성자에서 어떻게 구현될 수 있는지 확인하고 이해할 수 있다.

- 기본 생성자와 매개변수가 있는 생성자의 차이를 설명할 수 있다.

- this와 this()의 차이에 대해 설명할 수 있다.

 

# 내부 클래스 (Inner Class)

- 내부 클래스의 기본 개념과 장점에 대해 이해할 수 있다.

- 선언 위치에 따른 내부 클래스의 종류와 특징에 대해 이해하고 설명할 수 있다.

- 내부 클래스의 종류에 따른 유효 범위와 접근성을 이해할 수있다.

 

 

 

배운 것

# 생성자 (Constructor)

1. 생성자란?

 : 객체를 생성하는 역할을 하는 클래스의 구성요소 / 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

 : 인스턴트 생성은 new 키워드가 담당, 생성자는 인스턴스 변수를 초기화 하는 특수한 메서드

 → 생성자의 이름 = 클래스의 이름
 → 생성자는 리턴타입이 없음

 → 매개변수는 있을수도 없을수도 있음

 → 한 클래스 내에 여러 생성자 존재 가능

public class Basic {
    public static void main(String[] args) {    // 클래스명과 생성자의 이름이 같음 (Consrtuctor)
        Constructor constructor1 = new Constructor();                   // 리턴타입 없음
        Constructor constructor2 = new Constructor("Hello World");  // String 타입 리턴
        Constructor constructor3 = new Constructor(5,10);           // int 타입 리턴
       
    }    // 두 개 이상의 생성자를 정의할 수 있는 이유 : 자바가 오버로딩을 지원하기 때문
}

class Constructor {
    Constructor() { // (1) 생성자 오버로딩
        System.out.println("1번 생성자");   // 리턴타입 없음
    }

    Constructor(String str) { // (2)
        System.out.println("2번 생성자");   // String 타입 리턴
    }

    Constructor(int a, int b) { // (3)
        System.out.println("3번 생성자");   // int 타입 리턴
    }
}

 

 

2. 기본생성자 vs 매개변수가 있는 생성자

- 기본 생성자 (Default Consrtuctor)

DefaultConst(){}	// 매개변수가 없는 기본 생성자

 : 컴파일러가 자동으로 기본 생성자를 추가 해 주기 때문에 매개변수가 없는 생성자를 만들수 있었음

 → 생성자가 이미 있고, 기본생성자(매개변수X, 바디 내용X)를 추가로 만들었다면 기존 생성잘를 기본으로 사용

 

- 매개변수가 있는 생성자

: 고유한 특성을 가진 인스턴스를 계속 만들어야 할 때 유용

 → 매개변수가 있을 경우 개수와 타입, 순서에 맞게 알맞은 생성자를 호출해야 함

Car c = new Car("Model X", "빨간색", 250);

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

 

3. this()

 : this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용

 → 생성자의 내부에서만 사용 가능

 → 생성자의 첫 줄에 위치해야만 함

 

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 기본 생성자 호출!");
    };

    public Example(int x) {
        this();	// Example example = new Example(); 즉  public Example() 호출
        System.out.println("Example의 두 번째 생성자 호출!");
    }
}

//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!

 

- this 키워드

 : 인스턴스 변수와 매개변수의 이름이 같을 때, 구분이 힘든 경우 주로 사용

 → 자신이 포함된 클래스의 객체를 가리키는 this라는 참조변수

 → this 키워드를 지정할 때 키워드가 속한 클래스내의 변수를 나타냄

(메서드의 지역 변수명이 필드명과 동일하게 구성되어 있는 경우가 많음)

public class ConstructorExample {
    public static void main(String[] args) {
        Car car = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " +  car.getColor() + "입니다.");
    }
}

class Car {	// 변수 선언
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {	// 변수 값 할당
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {	// 리턴
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

 

 

 

 

# 내부 클래스 (Inner Class)

1. 내부 클래스란?

 : 클래스 내에 선언된 클래스 / 외부클래스와 내부 클래스가 서로 연관되어 있을 때 사용

 → 외부클래스의 멤버들에 접근이 쉽고, 코드의 복잡성이 줄어듬

 → 캡슐화 달성에도 유용

// 외부클래스 내에 포함될 수 있는 세가지 내부 클래스

class Outer { 	// 외부 클래스
	
	class Inner {
		// 인스턴스 내부 클래스(객체 내부에 멤버의 형태로 존재)
       	 	// 외부클래스의 모든 멤버에 접근 가능
	}
	
	static class StaticInner {
		// 정적 내부 클래스
        	// 내부클래스가 외부클래스의 존재와는 무관하게 정적변수를 사용하는 방법
	}

	void run() {
		class LocalInner {
		// 지역 내부 클래스
        	// 클래스의 멤버가 아닌 메서드 내에서 정의
        	// 메서드 안에서 선언 후 바로 객체생성해 사용함
		}
	}
}

 

 

2. 인스턴스 내부 클래스

class Outer { //외부 클래스
    private int num = 1; //외부 클래스 인스턴스 변수
    private static int sNum = 2; // 외부 클래스 정적 변수

    private InClass inClass; // 내부 클래스 자료형 변수 선언

    public Outer() {
        inClass = new InClass(); //외부 클래스 생성자
    }

    class InClass { //인스턴스 내부 클래스
        int inNum = 10; //내부 클래스의 인스턴스 변수

        void Test() {
            System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
        }
    }

    public void testClass() {
        inClass.Test();
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
        outer.testClass(); // 내부 클래스 기능 호출
    }
}

 : 이해한 내용

class Main 에서 outer.testClass(); 호출하고
내부클래스 testClass에서 다시 inClass.Test(); 호출하고
그 안에 내부 클래스 Test에서 값이 출력

 

 

 

3. 정적 내부 클래스 (static 사용)

class Outer { // 외부 클래스
    private int num = 3; // 외부 클래스의 인스턴스 변수
    private static int sNum = 4;

    void getPrint() {
        System.out.println("인스턴스 메서드");
    }

    static void getPrintStatic() {
        System.out.println("스태틱 메서드");
    }

    static class StaticInClass { // 정적 내부 클래스
        void test() {
            System.out.println("Outer sNum = " +sNum + "(외부 클래스의 정적 변수)");
            getPrintStatic();
            // num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
        a.test();
    }
}

 : 이해한 내용

static은 다른 변수나 메서드와 섞이지 않고 자기들 끼리만 영향을 주고 받음

static은 static끼리 그 외 인스턴스 변수는 인스턴스 변수 끼리

 

 → 정적 내부 클래스는 외부 클래스의 인스턴스 변수와 인스턴스 메서드에 직접적인 접근이 불가능

 → 정적 내부 클래스가 외부 클래스의 인스턴스와는 독립적인 존재

 → 정적 내부 클래스는 외부 클래스의 정적 변수와 정적 메서드에는 접근이 가능

 

 

4. 지역 내부 클래스

 

 

 

*****

1.접근 제어자

 : 클래스, 멤버변수, 메소드에 모두 적용 가능한 키워드

public
 : 어디서든 사용 가능 (접근에 제한이 없음)

private
 : 클래스 안에서만 사용 가능 
 (존재하는 클래스에서만 사용할 수 있고, 다른 클래스에서는 직접적인 사용이 불가능함)
 → getter와 setter를 사용하면 제한적 범위내에서 접근이 가능하기도 함

protexted
 : 같은 패키지 내부와 상속관계인 클래스만 접근 가능

default
 : 같은 패키지 내부에서만 접근 가능

 

2.

필드는 객체나 클래스의 속성을 나타내는 변수로, 기능을 정의하는데 사용되는 것은 메서드
필드는 클래스 변수와 인스턴스 변수를 가리키며, static 키워드의 유무로 구분할 수 있다.

클래스 변수는 해당 클래스의 모든 인스턴스가 공유하는 변수이므로, 각 인스턴스가 가지는 개별적인 속성을 정의하는 데는 사용되지 않습니다. 클래스 변수는 해당 클래스의 모든 인스턴스가 공통적으로 사용해야 하는 값을 정의하는데 사용

지역 변수는 스택 메모리 영역에 저장되며, 반드시 직접 초기화를 시켜주어야 한다.

반환타입은 메서드 오버로딩에 영향을 주지 못한다.

this 키워드는 인스턴스가 자기 자신을 가리킬 때 사용되므로 클래스 메서드 안에서는 사용하지 못합니다.
생성자 내에서 this(...)을(를) 호출하는 것은 같은 클래스 내의 또 다른 생성자를 호출하는 것과 같다.

 

 

 

 

Tomorrow Chapter

# 상속 (Inheritance)

# 캡슐화 (Encapsulation)

 

 

 


 

 

↓ 이전 글 ↓

 

 

[코드스테이츠] 04_21_TIL : 객체지향 프로그래밍 첫번째 _ 클래스, 객체, 필드, 메서드

Today I Lean 객체지향 프로그래밍 첫번째 _ 클래스, 객체, 필드, 메서드 너 학습목표 및 개념정리 # 클래스(Class) 와 객체 (Object) - 객체를 이해할 수 있다. - 클래스의 개념과 구성요소, 기본 문법을

theflower01.tistory.com

 

↓ 코트스테이츠 부트캠프 관련 글 한번에 보기 ↓

 

'IT/코드스테이츠 부트캠프' 카테고리의 글 목록

Flower, Plant, Study

theflower01.tistory.com

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading