1. 생성자에 대해 이해하고 설명할 수 있다.
2. 내부 클래스에 대해 이해하고 설명할 수 있다.
- 생성자
✔︎ 생성자 (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번 생성자");
}
}
✔︎ 기본 생성자 (Default Constructor) : 매개변수가 없는 생성자
클래스명(){} // 기본 생성자
✔︎ 매개변수가 있는 생성자 : 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 데 사용
✔︎ 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;
}
}
// 출력값
세 번째 생성자
두 번째 생성자
세 번째 생성자
- 내부 클래스
✔︎ 내부 클래스 (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
☞ 오늘은 어제 학습한 클래스와 객체, 필드와 메서드에 이어서 생성자와 내부 클래스에 대해 알아보는 시간을 가졌다. 상대적으로 넉넉한 시간이 주어졌지만 어제와 동일하게 헷갈리는 부분들과 이해하기 힘든 부분들이 많았다 😂 그렇지만 오후 실시간 세션 때 강사님이 최대한 이해하기 쉽게 노력해주셔서 혼자 공부했던 것보다 훨씬 더 많이 이해된 것 같다 ☺️
객체지향 프로그래밍 기초파트에 많은 예제 코드들이 주어졌는데 주말을 활용하여 직접 입력해서 결과값을 보며 공부해보기도 하고 스택 메모리와 힙 메모리를 손으로 그려서 위에서 아래로 내려오는 코드에 따라 어떻게 저장되고 실행되는지 과정을 생각하는 시간을 가져봐야겠다 :)
드디어 주말이다.. 이번 주 자바를 시작하며 많이 따라가기 벅찼지만, 다음 주 또 다음주 내용을 위해서 안밀리도록 항상 주말을 잘 활용해야할 것 같다. 이번 주말 마무리도 힘내보자!!! 😤
・ 상속
・ 캡슐화