본문 바로가기
Java(17+) 문법/Java 17 기본

[Java] 클래스 - 생성자/상속/추상클래스

by cogito21_java 2025. 1. 21.
반응형

클래스

생성자

- 생성자(constructor): 클래스의 인스턴스를 초기화하는 특별한 메서드. 클래스 인스터스화할 때 호출되면 인스턴스의 초기 값을 설정

- 생성자명은 클래스 이름과 동일

- 생성자는 메서드이지만 리턴타입이 없음

- 객체 생성시 자동으로 호출

- 생성자 이름 앞에는 접근 제어자 public 사용. public이 없다면 다른 패키지에서 생성자 호출이 불가

- 클래스에 생성자가 없다면 기본 생성자(매개변수 X)를 자동으로 추가

- this는 객체를 나타내는 참조 변수. 클래스 내부의 변수인지 메서드에서 받은 매개변수인지 구분하는데 사용. Static 메서드에서 사용불가

- static 메서드는 static 영역에 생성. 클래스의 인스턴스는 heap 영역에 생성

- 기본 생성자에 초기값 설정하는 것을 추천

- 생성자도 메서드의 한 종류로 오버로딩 가능

- this()로 다른 생성자 호출 가능. this()는 생성자이고 생성자 내무에서만 사용 가능. 항상 첫줄에 존재

더보기

생성자 선언

public class ClassName{
    private type memberVar;
    
    public className(){ // consturctor
        this.memberVar = value;
    }
    
    public className(type param1, ...){ // 생성자 오버로딩
        this.memberVar = param1;
    }
    
    public className(type param1, ...) { // 생성자 오버로딩, this() 생성자 사용
        this(param1, ...); // 호출하려는 생성자에 타입과 인수 개수를 맞춰야함
        실행되는 코드;
    }
}

클래스 인스턴스화

ClassName className = new ClassName();
ClassName className = new ClassName(arg1, ...);

생성자 예시

더보기
public class Animal {
    private String type;
    private String name;
    private int age;
    
    public Animal() {
        this.type = "";
        this.name = "";
        this.age = 0;
        System.out.println("Create Animal");
    }
    
    public Animal(String type, String name, int age) {
        this.type = type;
        this.name = name;
        this.age = age;
    }
    
    public void printInfo() {
        System.out.printf("type: %s, name: %s, age: %d", type, name, age);
    }
}

public class AnimalTest {
    public static void main(String[] args) {
        Animal animal = new Animal("dog", "Hen", 1);
        animal.printInfo();
    }
}

 

상속

- Java의 상속(extends)는 OOP의 특성으로 클래스 간에 코드를 재사용하고 관리를 위해 사용

- 부모 클래스의 멤버 변수와 메서드를 자식 클래스가 물려받는 것을 의미. 물려주는 쪽이 Parent Class, 물려받는 쪽인 Child Class

- 상속의 장점은 코드를 재사용과 계층 구조를 통한 다형성을 지원

- 다형성: 객체가 여러 가지 타입의 데이터를 가질 수 있는 성질. 기존의 클래스 수정 없이 새로운 기능 추가 및 변경이 가능

- 상속 받은 자식 클래스는 부모 클래스의 멤버 변수와 메서드를 직접 접근하여 사용 가능

- super()는 Java에서 부모 클래스의 생성자를 호출할 때 사용하는 키워드

- super는 부모 클래스를 의미. super.method()는 부모 클래스의 메서드 호출

- 상속 받은 메서드 오버라이딩의 경우 동일한 메서드명, 같은 리턴 타입, 동일한 매겨변수 타입과 개수를 가져야 함

더보기

상속받은 자식 클래스 선언

접근제어자 class ParentClassName {
    private type memberVar1;
    
    public ParentClassName(type param1, ...) {
        this.memberVar1 = param1;
        ...
    }
}

접근제어자 class ChildClassName extends ParentClassName {
    private type memberVarN;
    
    public ChildClassName(type param1, ...) {
        super(param1, ...); // 부모 클래스 생성자 호출
        this.memberVarN = paramN;
    }

}

자식 클래스에서 부모 클래서 메서드 오버라이딩

public class ParentClassName {
    public void methodName() {
    
    }
}

public class ChildClassName extends ParentClassName {
    public void methodName() { // 부모클래스의 메서드 오버라이딩
    
    }
}

자식 클래스 예시(상속)

더보기
public class Animal {
    public void sound() {
        System.out.println("Wooool");
    }
}

public class Dog extends Animal {

}

public class DogTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound();
    }
}

메서드 오버라이딩 예시

더보기
public class Animal {
    public void sound() {
        System.out.println("Wooool");
    }
}

public class Dog extends Animal {
    public void sound() {
        System.out.println("new Sound");
    }
}

public class DogTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound();
    }
}

추상 클래스

추상클래스

- 추상 클래스(abstract class): 한 개 이상의 추상 메서드를 가진 클래스

- 추상 메서드(abstract method): 구현체가 없는 메서드. 중괄호 블록이 없는 메서드

- 추상 클래스만으로는 인스턴스화 불가능. 반드시 상속을 받아 추상 메서드를 구현해야 인스턴스화 가능

- 추상 클래스는 수정을 최소화하면서 기능을 확장하고 싶을 때 사용. 공통된 부분은 그대로 두고 바뀌는 부분만 추상 클래스로 표현

- 메서드가 한 개만 있는 경우보다는 메서드가 두 개 이상인 경우에 추상 클래스 도입을 고려

- @Override 어노테이션은 자식 클래스에서 메서드가 오버라이드될 때 사용

+) 템플릿 메서드 패턴(template method pattern): 알고리즘의 골격을 정의하는 추상 클래스를 사용하여 알고리즘의 일부 단계를 서브 클래스에서 구체화하는 방식

+) 클래스 다이어그램: UML(통합 모델링 언어)의 다이어그램 중 하나로 클래스간의 관계와 구조를 보여주는데 사용되는 방식

+) Java에서 Object 클래스는 모든 클래스의 최상위 부모 클래스. Object 클래스는 equals(), toString() 등의 메서드 제공

+) public boolean equals(Object obj): 두 객체가 같은지 비교할 때 사용. 두 객체의 참조가 같은지 비교하며 필요에 따라 오버라이드하여 정의

+) public final Class<?> getClass(): 런타임 시 객체의 클래스 정보를 반환. 클래스의 메타데이터에 접근 가능

+) public int hashCode(): 객체의 해시 코드를 반환. 해시 코드는 해시 기반 컬렉션에서 객체를 사용할 때 필요. equals()와 일관성 유지 필요

+) public String toString(): 객체의 문자열 표현을 반환. 기본 구현은 객체의 클래스 이름과 해시 코드의 16진수 표현을 반환

더보기

추상 클래스 선언

접근제어자 abstract class AbstradtClassName { // 추상 클래스
    접근제어자 abstract type abstractMethodName(); // 추상 메서드
}

추상 클래스를 상속 받아 구현

접근제어자 class ClassName extends AbstractClassName {
    public type abstractMethodName() {
    
    }
}

추상클래스 사용

public abstract class AbstractClassName {
    public type methodName1(type param1, ...) {
      
    }
    
    public abstract type methodName2();
}

public class ClassName extends AbstractClassName {
    @Override
    public type methodName2() {
    
    }
}

추상클래스 예시

더보기
abstract class AbsPrint {
    public void repeat(int n) {
        for (int i = 0; i < n; i++) {
            print();
        }
    }

    public abstract void print();
}

class HelloPrint extends AbsPrint {
    @Override
    public void print() {
        System.out.println("Hello");
    }
}

class HiPrint extends AbsPrint {
    @Override
    public void print() {
        System.out.println("Hi");
    }
}

public class Main {
    public static void main(String[] args) {
        HelloPrint helloPrint = new HelloPrint();
        HiPrint hiPrint = new HiPrint();
        helloPrint.repeat(5);
        hiPrint.repeat(5);
    }
}

추상클래스 예제1

 

풀이1

 

반응형

'Java(17+) 문법 > Java 17 기본' 카테고리의 다른 글

[Java] 예외처리  (0) 2025.01.22
[Java] 제네릭/Enum  (0) 2025.01.22
[Java] 클래스 - 메서드  (0) 2025.01.21
[Java] 제어문  (0) 2025.01.21
[Java] 참고자료  (0) 2025.01.20