[4기] 백엔드 개발자 부트캠프 "오르미" ~ing/[4기] 백엔드 개발자 부트캠프 오르미 수업 복습

[4기] 32일차 Java ( 메소드 재정의, 추상클래스 )

sohee99 2024. 2. 2. 17:42

오늘의 학습!

 

메소드 재정의

 

메소드 오버로딩

 

- 메소드의 이름은 동일하고 입력 항목이 다른경우

 

void sleep()
void sleep(int hour)

 

이렇게! 이름은 동일하고 매개변수가 다를경우 오버로딩이라고 합니당!

 

부모클래스 Animal

 

public class Animal {

    String name;

    public void setName(String name) {
        this.name = name;
    }
}

 

자식클래스 Dog

public class Dog extends Animal{

    void sleep() {
        System.out.println(this.name + " Zzz...");
    }

    void sleep(int hour){
        System.out.println(this.name + " Zzz...");
    }

    void sleep(int a, double hour){
        System.out.println(this.name + " Zzz...");
    }

}

 

자식 클래스 HouseDog

 

public class HouseDog extends Animal{

    void sleep(int hour){
        System.out.println(this.name + " Zzz..." + hour);
    } //정수형일때 호출

    int sleep(double hour){ //실수형일때 호출
        return 0;
    }
    //만약리턴타입만 다르다면? 무엇을 호출해야할지 몰라서 오류난다.

    //메소드의 이름 같음
    //매개변수의 개수 또는 타입이 달라야 합니다.
}

 

메소드 오버라이딩

 

부모클래스 parent

public class Parent {

    void method1() {
        System.out.println("Parent의 method1 호출");
    }

    void method2() {
        System.out.println("Parent의 method2 호출");
    }
}

 

자식클래스 Child

 

public class Child extends Parent{

    void  method2(){
        System.out.println("child의 method2 호출");
    }

    void method3(){
        System.out.println("Child의 method3 호출");
    }
}

 

실행 ChildExample

 

public class ChildExample {

    public static void main(String[] args) {
        Child child = new Child();

        child.method1();
        child.method2();    // 재정의된 메소드 호출
        child.method3();
    }
}

 

부모클래스의 void method2() { System.out.println("Parent의 method2 호출"); } 를 

 

자식클래스에서 void method2() { System.out.println("Child의 method2 호출"); } 로 변경해서 

 

재정의 하는것이 메소드의 오버라이딩의 개념! 

 

 

오버라이딩의 규칙!

부모의 메소드와 동일한 시그니처(리턴타입, 메소드이름, 매개변수 리스트)를 가져야 한다.
부모 클래스의 메소드보다 접근 제한을 더 강하게 오버라이딩 할 수는 없다.
새로운 예외(Exception)를 throws 할 수 없다. (예외처리 Part에서 배웁니다)

 

 

부모클래스 Calculator

public class Calculator {
    private  static  final double PI = 3.14159;

    double areaCircle(int r){
        System.out.println("Calculator.areaCircle");
        return  PI * r * r;
    }
}

 

자식클래스 Calculator

 

public class Computer extends Calculator{
    @Override
    double areaCircle(int r){
        System.out.println("Computer 객체의 areaCircle() 실행");
        return  Math.PI * r * r;
    }
}

 

실행 ComputerExample

public class CalculatorExample {

    public static void main(String[] args) {
        int r = 10;
        Calculator calculator = new Calculator();
        System.out.println("원면적 : " + calculator.areaCircle(r));

        Computer computer = new Computer();
        System.out.println(" 원면적: " + computer.areaCircle(r));
    }
}

 

부모클래스에서 파이의 값 3.14159로 계산하였지만 좀 더 정밀한 계산을 위해 

 

자식 클래스에서 Math.PI를 이용하여 오버라이딩 해주었다. 

 

@Override
double areaCircle(int r){
    System.out.println("Computer 객체의 areaCircle() 실행");
    return  Math.PI * r * r;
}

이렇게 @Override 어노테이션은 생략가능하지만, 이 메소드가 오버라이딩 된것인지 컴파일러가 체크할 수 있으므로 

실수로 circle에서 le를 없이 오타를 내었을 때 @Override 컴파일오류가 발생하여 실수를 인지할 수 있다!

 

오버라이딩이라면 적는게 제일 베스트!!! 다른 사람들이 봤을 때도 

 

코드를 읽을 때 아 !~~ 오버라이딩이구나를 쉽게 알 수 있을 것이다!

 

 

추상클래스

 

추상메서드 - 자식 클래스에서 반드시 오버라이드 해야만 사용할 수 있는 메소드 

 

 

추상클래스 개념

 

추상 클래스란 추상메서드를 하나 이상 포함하는 클래스인데!

 

 

 

이렇게 새, 곤충, 물고기의 실체가 공통점이 동물이라는 점을! 

클래스로 따로 빼놓는것이 추상 클래스!!! 

 

추상 클래스는 일반 클래스와는 달리 객체 생성 사용 x 즉, new 연산자를 사용해 인스턴스를 생성 x

 

 

* 새로운 실체 클래스를 만들기 위해 부모클래스로만 사용한다.

 

 

이걸 굳이 추상클래스로 만드는 이유가 뭐지?

 

출처 - 이스트소프트 조성연

 

1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적
2. 실체 클래스를 작성할 때 시간을 절약

 

설계하는 사람이 여러명이다? 그럼 각자 자기만의 필드나 메소드의 이름을 지정할텐데 

그럼 데이터와 기능은 같지만 이름이 전부 제각각 이겠죠?

 

그리하여 추상 클래스를 정의하여 필드나 메소드의 이름을 통일 시킬 수 있는 장점! 

 

또한 공통된부분은 추상클래스에 모두 선언 후 차이점만 실체 클래스에 각각 선언하게 되면 시간 절약!!!까지 ㅎㅎ

 

추상클래스 - phone

public abstract class Phone {
    private String owner;

    public Phone(String owner) {
        this.owner = owner;
    }

    public void turnOn() {
        System.out.println("폰 전원을 켭니다.");
    }

    public void turnOff() {
        System.out.println("폰 전원을 끕니다.");
    }
}

 

자식 클래스 SmartPhone

public class SmartPhone extends Phone {
    // 생성자
    public SmartPhone(String owner) {
        super(owner);
    }

    // 메소드
    public void internetSearch() {
        System.out.println("인터넷 검색을 합니다.");
    }
}

 

이렇게 abstract를 사용하여 선언을 하게됩니당!

 

추상클래스라도 일반클래스와 동일하게 필드, 생성자, 메소드를 선언할 수 있다!

 

하지만!

public class PhoneExample {
    public static void main(String[] args) {
        // Phone phone = new Phone();

        SmartPhone smartPhone = new SmartPhone("홍길동");

        smartPhone.turnOn();   // Phone의 메소드
        smartPhone.internetSearch();
        smartPhone.turnOff();  // Phone의 메소드
    }
}

 

아까 위에서 말했듯이, 추상클래스는 객체를 생성할 수 없으므로 

 

자식클래스 객체를 생성하여 부모클래스(추상클래스) 메소드를 사용할 수 있다!

 

추상클래스 의 오버라이딩

 

 

출처 - 이스트소프트 조성연

 

추상클래스 Animal

 

public abstract class Animal {
    String kind;

    public abstract void sound();

}

 

자식클래스 Bird , Cat

 

public class Bird extends Animal{
    Bird(){
        kind = "조류";
    }
    @Override
    public void sound() {
        System.out.println("짹짹");
    }
}
public class Cat extends Animal{
    Cat(){
        kind = "포유류";
    }
    @Override
    public void  sound(){
        System.out.println("야옹");
    }
}

 

abstract 을 사용하여 강제적으로 자식클래스에서 Override를 작성 하게끔 사용한다! 

 

자식 클래스에서 부모 클래스 sound 메소드를 구현하지 않는다면?

 

컴파일 오류가 발생한다.!

 

무조건 정의를 사용하여야 할때 실수를 방지하기 위해 abstract를 통해 

 

강제적으로 자식클래스에서 사용해야한다! 라는 느낌! 

 

 

실체 자식클래스가 많으면 깜빡하고 정의를 하지 않을 수 있기때문에 

 

이것을 통해 실수가 방지되겠죠?! 컴파일오류가 발생하니 

 

으잉? 하고 찾을 수 있겠죠!!! ㅎㅎㅎ 

 

그리고 오늘 대망의 인터페이스...

 

 

솔직히 인터페이스 이해를 못하겠달까요?

 

음 ... 개념이 이해가 안된다기보단,,, 

 

추상클래스의 개념이랑 비슷한데 

 

왜 굳이 인터페이스를 사용하며 

 

어떤 상황에서 이걸 쓰고 저걸쓰고 하는지 이해가 안됐어요 ㅠㅠㅠ... 

 

 

그래서 (주말에 약속있지만) 최대한 시간내서 알아보고 인터페이스는 

 

따로 공부할 예정입니다!!!!!!!! ㅎㅎ

 

자바의 정석도 알아보고 해야겠어요 ㅠㅠㅠ 

 

 

오늘도 이렇게 열심히 공부했는데욥!!! 

 

인터페이스빼고는 나름 이해가 잘된거같아요 ㅎㅎㅎ 

 

원래는 추상클래스도 살짝 이해가 ? 음? 굳이? 이런느낌이였는데 

 

협업할때 사용 함으로써 통일감 + 유지보수까지 이해가 되더라구용 

 

 

ㅎㅎㅎㅎ이제 오늘 배운 내용 한번 더 코드 작성해보고 

 

주말 과제인 위클리퀴즈 코드 작성해보러 가볼까 합니다 %%~!!!!

 

 

주말에 약속있는만큼 더 하고 자야죠 ㅠㅠ흑,,,

 

 

 

그럼 다들 주말 잘 보내세엽 >_<