Back-End/JAVA

[JAVA] 스파르타코딩클럽 JAVA공부(3) - 객체지향의 이해와 상속

남건욱 2023. 5. 26. 01:15
반응형
목표

 

 

이번수업은 클래스, 상속, 인터페이스에 관해서 자세하게 알아보는 수업이다.

개념에 대해 잘 이해하고 넘어가는 것을 목표로 두었다.

상속 관련 부분은 이번연초에 정보처리기사 실기를 공부할 때 많이 헷갈렸던 부분이다.

이해하기 위해 많은 자료들을 찾아보았었는데, 이번 수업을 통해서 내가 제대로 숙지하고 있고 틀린 부분은 없는지 더 자세히 알아보는 유의미한 시간이 될 것 같다.

 

 

 

 

 

 

클래스 만들기

클래스를 만들기 위해서는 사진에 나온 4가지 과정이 필요하다. 

 

 

 

 

 

 

 

 

객체생성 연습

 

package week;

public class Main {
    public static void main(String[] args) {
        Car[] carArray = new Car[3];
        Car car1 = new Car();
        car1.changeGear('P');
        carArray[0] = car1;

        Car car2 = new Car();
        car2.changeGear('N');
        carArray[1] = car2;

        Car car3 = new Car();
        car3.changeGear('D');
        carArray[2] = car3;

        for(Car car: carArray){
            System.out.println("car.gear = " + car.gear);
        }


    }
}

 

package week;

public class Car {
    String company; // 자동차 회사
    String model; // 자동차 모텔
    String color; // 자동차 색
    double price; //자동차 가격
    double speed; // 자동차 속도, km/h
    char gear; // 기어상태(P, R, N, D)
    boolean lights; // 자동차 조명의 상태

    public Car(){
        System.out.println("생성자가 호출되었습니다! 객체가 생성됩니다.");

    }

    // gasPedal
    // input : kmh
    // output : speed
    double gasPedal(double kmh){
        speed = kmh;
        return speed;
    }

    // brakePedal
    // input : x
    // output : speed
    double brakePedal(){
        speed = 0;
        return speed;
    }

    // changeGear
    // input : gear(char type)
    // output : gear
    char changeGear(char type){
        gear = type;
        return gear;
    }

    // onOffLight
    // input : x
    // output : lights(boolean)
    boolean onOffLight(){
        lights = !lights;
        return lights;
    }

    // horn
    // input : x
    // output : x
    void horn(){
        System.out.println("빵빵!");
    }
    
}

각각 Main.java, Car.java이다.

이번코드는 Car형식의 객체를 지정해 준 뒤 생성하는 것을 연습해 보았다.

위처럼 코드를 작성하고 실행하면 

"생성자가 호출되었습니다! 객체가 생성됩니다."라고 3번이 출력되고 추가로
car.gear = P
car.gear = N
car.gear = D

라고 출력이 된다. 제일 앞 public이 작성되어서 참조가 가능하고 다른 종류의 접근제어자로는 private, protected, default 등이 존재한다.

 

 

 

 

 

 

 

 

 

오버로딩

 

고등학교시절 C언어를 처음 배울 때 함수의 이름이 같은데 매개변수만 다르게 하면 사용이 가능하다길래 신기해하였던 경험이 있다. 그것의 이름이 오버로딩이었던 것 같다. 사진과 같이 오버로딩의 조건과 장점을 볼 수 있고, 코딩을 하다 보면 같은 기능을 하지만 받는 매개변수 타입이 다른 메서드가 있다. 그리고 그 메서드 이름을 지어주는 게 생각보다 고민이 될 때가 있다. 그때 사용하면 편리할 것 같다.

 

 

 

 

 

 

 

 

Getter와 Setter

 

Getter, Setter 개념은 프로젝트를 사용하면서 자주 쓰이는 개념이라고 한다. 보안의 3요소 중 하나인 무결성을 보장하기 위해 사용하고 외부에서 사용할 수 있게 하거나, 변경할 수 없게 하는 역할을 해준다고 보면 될 것 같다.

 

 

 

 

 

 

 

 

오버라이딩

오버라이딩의 개념이다.

자식클래스에서는 Super, Super()을 사용해서 부모클래스가 가지고 있는 것들에 대해 변경하거나 재정의가 가능하다. 또한 this, this()을 사용하게 되면 부모클래스의 변화를 주지 않고 현재클래스에 대한 값을 변경할 수가 있다.

 

 

 

 

 

 

 

 

 

과제

 

오늘의 과제는 계산기 만들기였다. 총 4 스태프로 구성되어 있었다.

 

 

 

보기만 해도 복잡했고, 하나하나 천천히 시작해야겠다고 생각이 들었다.

 

 

 

 

step1

step1
step1. Calculator.java

먼저 Calculator 클래스를 만들어주었다. 그 후 값을 반환할 double형 변수 answer을 생성해준 뒤, operator.equals() 메서드를 사용하여 들어온 인자값을 확인해 주었다. +, -, *, / 중 무엇이 들어왔는지 확인 후 그에 맞는 계산법을 적용해서 answer안에 넣어준다. 그 뒤 answer값을 리턴해주고 마무리되는 식으로 처리하였다.

 

 

 

step1. Main.java

메인클래스에서는 아까 만든 Calculator클래스 안의 calculate메서드를 사용할 수 있도록

Calculator calculator = new Calculator();을 선언하여 인스턴스를 생성해 주었고

아래처럼 부호와 숫자 1, 숫자 2를 입력하면 정상적으로 값이 나오도록 테스트해 보았다.

 

 

 

 

 

 

 

 

step2

step2

step2는 나머지 연산자를 수행할 수 있도록 Calculator내부를 수정해 주면 끝이었다.

 

 

 

step2. Calculator.java

operator.equals("%")를 추가해 주고 아래에 계산식만 추가해주고 step2는 종료되었다.

 

 

 

 

 

 

 

 

 

 

step3

step3

step3는 방금 구현한 기능들을 따로 클래스를 만들어준 후 관계를 정의해 주는 작업이었다.

 

 

 

step3. AddOperation.java
step3. substractOperation.java
step3. MultiplyOperation.java
step3. DivideOperation.java

 

일단 각각의 클래스를 만들어주고 선언을 시작하려고 계획했고, 먼저 각각 클래스를 만들어주었다.

 

 

 

 

step3 Calculator.java

private형식으로 변수를 만들어 사용할 수 있게 하였고, 그 후 클래스가 실행될 때 자동으로 각각 형식의 변수 안에 값이 저장될 수 있도록 만들어주었다.

 

 

 

 

step3. Calculator.java

또한 calculate메서드도 변경해 주었다. 원래 직접 각각 변경해 주었다면 현재는 각각의 클래스에서 계산하여 값을 가져오도록 만들어주었다.

 

 

 

step3. Main.java

메인자바에서도 기본적으로 각각의 클래스 인스턴스를 받을 수 있게끔 수정해 주었다.

이렇게 스탭 3까지 끝냈다.

 

 

 

 

 

 

step4

step4

step4는 앞에서 만들어둔 4가지 클래스들을 추상클래스를 사용하여 추상화하고 Calculator 클래스의 내부를 변경하면 되는 것이었다.

 

 

 

 

step4. AbstractOperation.java

추상화에 사용할 클래스하나를 만들어서 매개변수로는 정수두 개를 받고 double 형식으로 반환해 줄 operate 메서드를 생성해 주었다.

 

 

 

 

step4. AddOperation.java
step4. SubstractOperation.java
step4. MultiplyOperation.java
step4. DivideOperation.java

각 클래스 뒤에 extends AbstractOperation을 선언하여서 AbstractOperation클래스를 사용할 수 있게 하였다.

그 후 오버라이딩을 하여서 AbstractOperation클래스 안의 operate메서드를 가져와 사용하게 해 주었다.

 

 

 

step4. Calculator.java

Calculator 클래스에서도 기존의 복잡한 선언들을 제거하고 추상화클래스를 사용한 선언만 추가해 주었다.

코드가 이전보다 엄청 간결해진 것을 알 수 있다.

 

 

 

step4. Main.java

메인클래스에서도 복잡하게 선언했던 것을 지워주었다. 그 후 +, -, *, /을 사용할 때 구문만 바꿔주면 완성이다.

이로써 추상화, 오버라이딩등을 사용해서 코드를 짜면 얼마나 간결해지고 깔끔하게 코딩을 할 수 있는지 학습이 종료되었다.

 

 

 

 

 

 

 

 

 

정리

상속, 추상화, 오버라이딩 개념은 대충 넘어가서는 안 되는 개념이라고 생각됐다. 정보처리기사 공부를 할 때도 이 부분에 시간을 가장 많이 투자했던 기억이 난다. 왜 이렇게 코드를 작성하고 추상화를 해야 하고 오버라이딩을 해야 하는지 스스로에게 물어보면서 깨달아야 비로소 이정보들이 자신의 것으로 들어온다고 생각된다. 나도 이번 공부를 할 때는 계속 클래스를 변경해 가며 확인하면서 왜 여기서는 이렇게 사용하고 이 개념을 사용하는 이유는 무엇인지 생각하면서 공부하였다. 또한 대학교시절 다이어그램을 배울 때 들었던 생각인데, 다이어그램은 나중에 언제 사용할까? 다이어그램 만드는 게 더 복잡한 거 같다는 생각을 잠깐 헀었는데 현재 공부를 하면서 다이어그램으로 정리 후 코딩을 하게 되면 훨씬 수월하다는 것을 느꼈다. 이번수업은 어렵고 머리를 아프게 했지만 그만큼 많은 배움을 얻었다고 생각된다.

반응형
프로필사진

남건욱's 공부기록