부트캠프에서 처음으로 java수업을 받고 있기에 기록하는 게 좋다고 생각했고, 수업이 있는 날이면 매일 글을 쓰려고 합니다. 쵀대한 몰랐거나 필요하다고 생각되는 내용 위주로 기록할 예정입니다. (제가 게을러서 이러한 시도를 성공한 적이 없기에 이번 부트캠프 목표 중 1가지입니다. 할 수 있도록 화이팅!!)
부모 클래스의 구현을 재사용하고 확장하는 데 사용된다. 사용하면 부모 클래스의 모든 멤버(필드, 메서드)를 자식이 상속받는다. (📝항상 단일 상속만 가능 즉, 하나의 클래스는 하나의 부모 클래스만 상속받을 수 있다.)
class Animal {
    void move() {
        System.out.println("Animal moves.");
    }
}
class Dog extends Animal {
    void bark() {
        System.out.println("Dog barks.");
    }
}
클래스가 특정 기능을 제공하도록 강제하는 데 사용, 거의 모든 경우 인터페이스를 구현할 때 사용된다. (📝다중 구현이 가능 즉, 하나의 클래스는 여러 개의 인터페이스를 구현할 수 있다)
interface Soundable {
    void makeSound();
}
class Cat implements Soundable {
    @Override
    public void makeSound() {
        System.out.println("Cat meows.");
    }
}
class ParentClass {
    String name;
    ParentClass(String name) {
        this.name = name;
    }
    void greet() {
        System.out.println("Parent Class: Hello!");
    }
}
class ChildClass extends ParentClass {
    ChildClass(String name) {
    //super()는 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출하는 데 사용
        super(name); // 부모 클래스의 생성자 호출
    }
    @Override
    void greet() {
  /** super 키워드는 자식 클래스에서 부모의 멤버(필드, 메서드)에 접근하는 데 사용한다.
   자식 클래스의 생성자에서 super()를 호출하지 않으면, 
   컴파일러는 자동으로 부모의 기본 생성자(매개변수가 없는 생성자)를 호출**/
        super.greet(); // 부모 클래스의 메서드 호출
        System.out.println("Child Class: Hello!");
    }
    void introduce() {
        /** 부모 클래스의 메서드를 오버라이드(Override)한 경우, 
        부모 클래스의 메서드를 호출하고 싶을 때 부모 클래스의 필드에 접근하고 싶을 때 **/    
        super.greet();
        System.out.println("My name is " + super.name + "."); // 부모 클래스의 필드 접근
    }
}
public class SuperExample {
    public static void main(String[] args) {
        ChildClass child = new ChildClass("Child");
        child.greet();
        child.introduce();
    }
}
오버로딩은 생성자(constructor)에서 자주 사용되지만, 일반 메서드에서도 유용하게 활용됩니다. 오버로딩을 통해 코드의 유연성을 높이고 가독성을 향상시킬 수 있다.
class Person {
    String name;
    int age;
    public Person() {   // 기본 생성자
        this.name = "Unknown";
        this.age = 0;
    }
    public Person(String name) { // 이름만 초기화하는 생성자
        this.name = name;
        this.age = 0;
    }
    public Person(String name, int age) {  // 이름과 나이를 초기화하는 생성자
        this.name = name;
        this.age = age;
    }
}
class Calculator {
  
    public int add(int a, int b) {  // 정수 덧셈
        return a + b;
    }
    public double add(double a, double b) {  // 실수 덧셈
        return a + b;
    }
    public int add(int a, int b, int c) {    // 세 개의 정수 덧셈
        return a + b + c;
    }
}