gukbi

extends

class Animal { public void makeSound(){ System.out.println(“동물이 소리를 냅니다.”); } } class Cat extends Animal{ public void eat(){ System.out.println(“고양이가 생선을 먹습니다.”); } } public class Main{ public static void main(String[] args){ Animal a1 = new Cat(); // 가능 Cat a2 = new Animal(); // 불가능 Type mismatch: cannot convert from Animal to Cat a1.makeSound(); // 가능 a1.eat(); // 불가능 The method eat() is undefined for the type Animal ((Cat)a1).eat(); // 가능 System.out.println(a1.getClass()); // class com.the.ex.Cat System.out.println(a1 instanceof Animal); // true System.out.println(a1 instanceof Cat); // true System.out.println(a1.getClass() == Animal.class); // false System.out.println(a1.getClass() == Cat.class); // true } }

# Abstract
- 추상(abstract) 클래스는 new 로 오브젝트 생성이 불가 하다.
- 추상(abstract) 메소드는 선언 구현부가 없다.
- 추상클래스,메소드는 앞에 abstract를 붙인다.
- 추상메소드는 구현부가 없는 메소드다.
- 추상클래스는 추상 메소드를 포함한 클래스이다.
- 추상 클래스는 자체클래스를 생성할 수 없다.
- 부모 클래스를 생성하고 싶으면 자식을 통해서 추상 메소드를 재정의 한 다음 실행한다.

# Interface
```java
interface Product {
    public void getPrice();
}
class TV implements Product {
    @Override
    public void getPrice(){
        System.out.println("TV가격5십만뤈");
    }
}
class Computer implements Product {
    @Override
    public void getPrice(){
        System.out.println("컴퓨터가격6십만원");
    }
}

Difference of abstract and interface (Use of ChatGPT)

Java에서 추상 클래스 (Abstract Class)인터페이스 (Interface)는 모두 추상화(abstraction)를 달성하기 위해 사용되지만, 몇 가지 중요한 차이점이 있습니다:

1. 목적 (Purpose):

2. 메서드 구현 (Method Implementation):

3. 다중 상속 (Multiple Inheritance):

4. 생성자 (Constructors):

5. 필드 (Fields):

6. 접근 제한자 (Access Modifiers):

7. 사용 사례 (Use Case):

예시:

추상 클래스:

abstract class Animal {
    abstract void sound();
    
    void sleep() {
        System.out.println("Animal is sleeping");
    }
}

인터페이스:

interface Animal {
    void sound();
    
    default void sleep() {
        System.out.println("Animal is sleeping");
    }
}

요약:

Lambda

// Use without lambda
interface Calculator {
    int calculate(int a, int b);
}
class Addition implements Calculator {
    public int calculate(int a, int b) {
        return a + b;
    }
}
class Subtraction implements Calculator {
    public int calculate(int a, int b) {
        return a - b;
    }
}
class Multiplication implements Calculator {
    public int calculate(int a, int b) {
        return a * b;
    }
}
class Division implements Calculator {
    public int calculate(int a, int b) {
        return a / b;
    }
}
public class Main {
    public static void main(String[] args) {
        Calculator addition = new Addition();
        Calculator subtraction = new Subtraction();
        Calculator multiplication = new Multiplication();
        Calculator division = new Division();
        System.out.println(addition.calculate(10, 5));
        System.out.println(subtraction.calculate(10, 5));
        System.out.println(multiplication.calculate(10, 5));
        System.out.println(division.calculate(10, 5));
    }
}
// Use of lambda
interface Calculator {
    int calculate(int a, int b);
}
public class LambdaExample {
    public static void main(String[] args) {
        Calculator addition = (a, b) -> a + b;
        Calculator subtraction = (a, b) -> a - b;
        Calculator multiplication = (a, b) -> a * b;
        Calculator division = (a, b) -> a / b;
        int num1 = 10;
        int num2 = 5;
        System.out.println(num1+"+"+num2+"="+addition.calculate(num1, num2));
        System.out.println(num1+"-"+num2+"="+subtraction.calculate(num1, num2));
        System.out.println(num1+"*"+num2+"="+multiplication.calculate(num1,num2));
        System.out.println(num1+"/"+num2+"="+division.calculate(num1, num2));
    }
}
interface Calculate {
    int calculate(int a, int b);
}
class Add implements Calculate {
    @Override
    public calculate(int a, int b){
        int sum = a + b;
        return sum;
    }
}
public class MyClass2 {
    public static viod main(String[] args){
        Add add = new Add();
        System.out.println(add.calculate(10,20));

// 익명 클래스
        Calculate minus = new Calculate() {
            public int calculate(int a, int b){
                int sum = a - b;
                return sum;
            }
        }
// 인터페이스에 추상메소드가 1개일 경우
// 1. 상속받아 재정의 한다음 자식객체를 생성해서 사용한다.
// 2. 익명클래스로 재정의 한다음 자식객체를 생성해서 사용한다.
// 3. 람다식을 사용해서 객체생성후 사용한다.

// Lambda
// 기본모양 (매개변수) -> {실행문}
        Calculate multi = (a,b) -> a * b;
        System.out.println(multi.calculate(10, 20));
// 매개변수관련
//() -> {} 매개변수가 없으면 빈 소괄호를 사용한다.
//a -> {} 매개변수가 1개이면 소괄호를 생략 할 수 있다.
//(a,b) -> {} 매개변수가 여러개일때는 반드시 소괄호를 한다.

//실행문관련
// 실행코드가 한줄일 경우 {}괄호를 생략 할 수 있다.
// 중괄호를 생략하면 return 값을 생략할 수 있다.
// (a,b) -> {
//   return a + b;
// }
    }
}