클래스
생성자
- 생성자(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 |