12Days) 객체지향 프로그래밍 기초(2) - 생성자와 내부 클래스

nacSeo (낙서)·2022년 11월 4일
0

◉ 학습목표

1. 생성자에 대해 이해하고 설명할 수 있다.
2. 내부 클래스에 대해 이해하고 설명할 수 있다.
  1. 생성자

⦿ 학습내용

☞ 생성자

✔︎ 생성자 (Constructor) : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
✔︎ 생성자 특징
① 생성자의 이름은 반드시 클래스 이름과 같아야 함
② 생성자는 리턴 타입 ❌

클래스명(매개변수) {	// 생성자 기본 구조
	...
}

✔︎ 오버로딩 활용 가능

public class ConstructorExample {
	public static void main(String[] args) {
    	Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor("Hello World");
        Constructor constructor3 = new Constructor(5,10);
        }
    }

class Constructor {
	Constructor() {	// 생성자 오버로딩1
    	System.out.println("1번 생성자");
    }

	Constructor(String str) {	// 생성자 오버로딩2
    	System.out.println("2번 생성자");
    }
    
    Constructor(int a, int b) {	// 생성자 오버로딩3
    	System.out.println("3번 생성자");
    }
}

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

✔︎ 기본 생성자 (Default Constructor) : 매개변수가 없는 생성자

클래스명(){}	// 기본 생성자

✔︎ 매개변수가 있는 생성자 : 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 데 사용

☞ this vs this()

✔︎ this() : 자신이 속한 클래스에서 다른 생성자를 호출하는 경우 사용
✔︎ this() 메서드 사용 조건
① this() 메서드는 반드시 생성자의 내부에서만 사용
② this() 메서드는 반드시 생성자의 첫 줄에 위치
✔︎ this : 인스턴스 자신을 가리키며, 인스턴스 자신의 변수에 접근할 때 사용

public class PersonTest {
	public static void main(String[] args) {
    	Person kimcoding = new Person("김코딩", "프로그래머", 28);
        Person nahacker = new Person("나해커", "해커", 30, true);
    }
}
class Person {
	private String name;
    private String occupation;
    private int age;
    private boolean isSingle;
    
    Person(String name, String occupation, int age) {
    	this(name, occupation, age, false);
        System.out.println("두 번째 생성자");
    }
    
    Person(String name, String occupation, int age, boolean isSingle) {
    	System.out.println("세 번째 생성자");
        this.name = name;
        this.occupation = occupation;
        this.age = age;
        this.isSingle = isSingle;
    }
}

// 출력값

세 번째 생성자
두 번째 생성자
세 번째 생성자
  1. 내부 클래스

⦿ 학습내용

☞ 내부 클래스

✔︎ 내부 클래스 (Inner Class) : 클래스 내에 선언된 클래스, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용

class Outer {	// 외부 클래스

	class Inner {
    	// 인스턴스 내부 클래스
    }
    
    static class StaticInner {
    	// 정적 내부 클래스
    }
    
    void run() {
    	class LocalInner {
        // 지역 내부 클래스
        }
    }
}

✔︎ 내부 클래스 종류

☞ 멤버 내부 클래스 (인스턴스 내부 클래스, 정적 내부 클래스)

✔︎ 인스턴스 내부 클래스 : 객체 내부에 멤버의 형태로 존재, 외부 클래스의 모든 접근 지정자의 멤버에 접근 가능

class Outer {	// 외부 클래스
	private int num = 1;	// 외부 클래스_인스턴스 변수
    private static in 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();	// 내부 클래스 기능 호출

// 출력값

외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스_인스턴스 변수)
Outer sNum = 2(외부 클래스_정적 변수)

※ 유의사항 : 인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 후에 사용해야 함. ∴ 클래스의 생성과 상관없이 사용할 수 있는 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 선언 ❌
✔︎ 정적 내부 클래스 : 내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 가능, static 키워드 사용

class Outer { // 외부 클래스
	private int num = 3;	// 내부 클래스의 인스턴스 변수
    private static in sNum = 4;
    
    void getPrint() {
    	System.out.println("인스턴스 메서드");
    }
    
    static void getPrintStatic() {
        System.out.println("스태틱 메서드");
    }
    
    static class StaticInClass {	// 정적 내부 클래스
    	void test() {
        	System.out.prnitln("Outer num = " + sNum + "(외부 클래스_정적 변수)");
            getPrintStatic();
            // num과 getPrint() 는 정적 멤버가 아니라 사용 불가
        }
    }
}

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

// 출력값
Outer num = 4(외부 클래스_정적 변수)
스태틱 메서드

☞ 지역 내부 클래스

✔︎ 지역 내부 클래스 : 멤버가 아닌 메서드 내에서 정의되는 클래스
✔︎ 메서드 내부에서만 사용 가능, 일반적으로 메서드 안에서 선언 후 바로 객체 생성하여 사용

class Outer {	// 외부 클래스
	int num =5;
    void test() {
    	int num2 = 6;
        class LocalInClass {	// 지역 내부 클래스
        	void getPrint() {
            	System.out.println(num);
                System.out.println(num2);
            }
        }
        LocalInClass localInClass = new LocalInClass();
        localInClass.getPrint();
    }
}
public class Main {
	public static void main(String[] args) {
    	Outer outer = new Outer();
        outer.test();
    }
}

// 출력값
5
6

◉ 느낀 점

☞ 오늘은 어제 학습한 클래스와 객체, 필드와 메서드에 이어서 생성자와 내부 클래스에 대해 알아보는 시간을 가졌다. 상대적으로 넉넉한 시간이 주어졌지만 어제와 동일하게 헷갈리는 부분들과 이해하기 힘든 부분들이 많았다 😂 그렇지만 오후 실시간 세션 때 강사님이 최대한 이해하기 쉽게 노력해주셔서 혼자 공부했던 것보다 훨씬 더 많이 이해된 것 같다 ☺️

객체지향 프로그래밍 기초파트에 많은 예제 코드들이 주어졌는데 주말을 활용하여 직접 입력해서 결과값을 보며 공부해보기도 하고 스택 메모리와 힙 메모리를 손으로 그려서 위에서 아래로 내려오는 코드에 따라 어떻게 저장되고 실행되는지 과정을 생각하는 시간을 가져봐야겠다 :)

드디어 주말이다.. 이번 주 자바를 시작하며 많이 따라가기 벅찼지만, 다음 주 또 다음주 내용을 위해서 안밀리도록 항상 주말을 잘 활용해야할 것 같다. 이번 주말 마무리도 힘내보자!!! 😤

◉ 내일의 키워드

・ 상속
・ 캡슐화
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글