WIL (Weekly I Learned) 220718-220724

BOSEUL KIM·2022년 7월 24일
0

TIL / WIL

목록 보기
4/9

이번 주는 목요일까지 알고리즘 공부를 했고, 목요일에 알고리즘 테스트를 무사히 마쳤다 ᵈʕ ᵔⰙᵔ ʔᵇ

에전부터 알고리즘, 코딩테스트 이런거에 관심이 있고 공부하고 싶긴했지만 어떻게 해야되지,,하는 막연한 궁금증만 갖고 시도하지 못했었는데 이렇게 무작정이지만 시도해보니까 나름 할 만하고 재미있었다 ㅋㅋㅋ

학창시절에 수학문제 풀던 것 같은 느낌,, 물론 그거보다 어렵지만 (•́ι_•̀*)

머리를 너무 많이 써서 배가 금방 고팠다,,,

화요일에 봤던 알고리즘 모의고사에서는 문제 2가지 중에서 2번을 고르고 풀었는데 생각보다 애먹어서 당황해서 마무리르 제대로 못했다 (´;︵;)

문제 해설 영상도 찍어야 했기 때문에 허둥지둥 제출하고 나서 마무리했는데 아쉽다 ㅜㅜ

그래서 알고리즘 테스트도 살짝 걱정했는데 모의고사 때 보다 1시간이나 더 주어져서 3시간이나 있엇는데 해설 영상 업로드까지 30분만에 마쳐서 좋았다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

그러고 나서 해야할 게 스프링 입문 전에 자바의 객체지향에 대해 과제를 하는 것이었는데,,,,,,,,!!!!

막상 시작하고나니 알고리즘보다 어려웠다 |_-。)

분명 전에 JAVA에 대해서 배울 때 객체지향도 배우긴 했는데
당연히 제대로 이해하지 못하고 넘어갔고 그 뒤로도 딱히 사용해보지 않아서
제대로 알 수가 없엇다,, 증말 어렵구요,, 어렵습니다,,

다행히 팀원으로 계신 윤섭님께서 조금은 알고계셔서 도움을 많이 받았다

아예 0에서 시작하는 것 보다는 조금은 진행된 상태에서 이해하는게 더 좋았다

글로는 아무리 읽어도 그냥 후루룩 머리에서 사라지기 때문,,

그럼 객체지향에 대해서 정리해보겠습니다~~

객체지향 프로그래밍 - Object Oriented Programming (OOP)

객체지향 프로그래밍이란?

  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

객체지향 프로그래밍을 하는 이유는 명확하다

  • 코드 재사용이 용이
    : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
  • 유지보수가 쉬움
    : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
  • 대형 프로젝트에 적합
    : 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다.

물론 단점도 있다.

  • 처리 속도가 상대적으로 느림
  • 객체가 많으면 용량이 커짐
  • 설계할 때 많은 시간과 노력이 필요

객체지향 프로그래밍의 키워드

1) 클래스 + 인스턴스(객체)
2) 추상화
3) 캡슐화
4) 상속
5) 다형성

이번 과제에서 이 키워드들을 모두 이해하긴 힘들었지만 그래도 전보다는 꽤 많이 깨닫는 시간이었던 것 같다

< 과제 >

  1. 아래의 정보를 가지는 ‘Bus’ 클래스 모델링

    • 포함해야 할 정보
      1. 최대 승객수
      2. 현재 승객수
      3. 요금
      4. 버스 번호
      5. 주유량
      6. 현재 속도
      7. 상태
        1. 운행, 차고지 행
    • 기능
      1. 운행
      2. 버스 상태 변경
      3. 승객 탑승
      4. 속도 변경

    요구사항

    • 버스 번호
      • 버스 객체 생성시 번호는 고유값으로 생성되어야 합니다.
    • 버스 상태 변경
      • 버스 객체 생성시 최초 상태는 ‘운행’ 상태가 되며
      • 주유량이 떨어지거나, 운행을 종료할 때 ‘차고지행’ 상태로 변경 합니다.
      • 10미만일 경우 ‘주유가 필요하다’는 메시지를 출력해 주세요
    • 승객 탑승
      • 승객 탑승은 ‘최대 승객수’ 이하까지 가능하며 ‘운행 중’인 상태의 버스만 가능합니다.
      • 탑승시 현재 승객수가 증가되어야 합니다.
    • 속도 변경
      • 주유 상태를 체크하고 주유량이 10 이상이어야 운행할 수 있습니다.
        • 경고메시지
          • 주유량을 확인해 주세요.
          • print문으로 출력
      • 변경할 속도를 입력 받아 현재 속도에 추가 하거나 뺄 수 있어야 합니다.
  2. 아래의 정보를 가지는 ‘Taxi’ 클래스 모델링

    • 포함해야 할 정보
      1. 택시 번호
      2. 주유량
      3. 현재속도
      4. 목적지
      5. 기본거리
      6. 목적지까지 거리
      7. 기본 요금
      8. 거리당 요금
      9. 상태 (운행 중, 일반)
    • 기능
      1. 운행시작
      2. 승객 탑승
      3. 속도 변경
      4. 거리당 요금 추가
      5. 요금 결제
    • 요구 사항
      • 운행 시작
        • 운행 시작전 주유상태를 체크 하고 주유량이 10 이상이어야 운행 가능
      • 승객탑승
        • 승객 탑승은 택시 상태가 ‘일반'일 때만 가능합니다.
        • 그 외 택시는 ‘탑승 불가’ 처리를 해주세요.
        • ‘일반’ 상태의 택시가 승객을 태우면 ‘운행 중’ 상태로 변경해 주세요
      • 속도 변경
        • 변경할 속도를 입력 받아 현재 속도에 추가 하거나 뺄 수 있어야 합니다.
      • 거리당 요금 추가
        • 기본 거리보다 먼 곳은 추가 요금이 붙습니다.
        • 기본 거리와 추가 요금은 자유롭게 산정해 주세요
      • 요금 결제
        • 최종 요금을 출력하는 것으로 합니다.

처음에 읽고 멘붕부터 왔다,,, 알고리즘보다 어려웠어,,,

일단 전체적인 맥락으로 이해해보자면,

대중교통이라는 부모클래스에 버스와 택시가 공통으로 갖는 요소와 메소드들을 작성하고
각 버스와 택시 클래스에서 이를 상속받아 사용하는 것으로 작성한다
또한, 부모클래스에 없는 요소나 메소드가 따로 필요할 경우는 각 클래스에 작성해주면 된다. 고 먼저 이해를 했다

처음에는 아예 뭐부터 해야할 지 몰랐지만 일단 해봤다,,
대중교통 클래스 먼저 생성해주었다.

필드로는 버스와 택시가 가질 번호(num)값과 주유량, 속도, 최대승객 수, 현재 승객수, 요금, 상태를 선언해주었고

메소드는 운행 시작/상태 변경/승객 탑승 세 가지를 만들어줬는데 승객 탑승 메소드에서는 택시와 버스가 다른 부분이 많아 오버로딩을 통해서 받아오는 인자값을 다르게 설정해 두개로 나눠 만들었다.

public class PublicTransportation {
    int num;
    int fuelVolume = 100;
    int speed = 0;
    int maxPassenger;
    int currentPassenger;
    int price;
    String state;

    public PublicTransportation() {

    }

    // 운행 시작
    public void startOperation(String state) {
        this.state = state;
    }

    // 상태 변경
    public void changeState() {
        if (this.state == "운행") this.state = "차고지행";
        else if (this.state == "차고지행") this.state = "운행";

        if (fuelVolume < 10) {
            this.state = "차고지행";
        }
    }

    // 승객 탑승 - 버스
    public void boardingPassenger(int newPassenger) {
        this.maxPassenger = 30;
        if (this.currentPassenger + newPassenger <= maxPassenger && state.equals("운행")) {
            this.currentPassenger += newPassenger;
            System.out.println("탑승 승객 = " + newPassenger);
            System.out.println("잔여 승객 = " + currentPassenger);
            System.out.println("요금 확인 = " + price * newPassenger);
        } else {
            System.out.println("최대 승객 수를 초과하였습니다");
            currentPassenger = 20;
        }
    }

    // 승객 탑승 - 택시
    public void boardingPassenger(int newPassenger, String destination, int distanceDestination) {
        this.currentPassenger = 0;
        this.price = 3000;
        this.maxPassenger = 4;
        if (state.equals("일반") && newPassenger <= maxPassenger) {
            this.currentPassenger += newPassenger;
            System.out.println("탑승 승객 = " + newPassenger);
            System.out.println("잔여 승객 = " + currentPassenger);
            System.out.println("기본 요금 확인 = " + price);
            System.out.println("목적지 = " + destination);
            System.out.println("목적지까지 거리 = " + distanceDestination + "km");
            state = "운행중";
        } else {
            System.out.println("탑승 불가");
        }
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getFuelVolume() {
        return fuelVolume;
    }

    public void setFuelVolume(int fuelVolume) {
        this.fuelVolume = fuelVolume;
        if (fuelVolume < 10) {
            System.out.println("주유 필요!");
            changeState();
        }
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getMaxPassenger() {
        return maxPassenger;
    }

    public void setMaxPassenger(int maxPassenger) {
        this.maxPassenger = maxPassenger;
    }

    public int getCurrentPassenger() {
        return currentPassenger;
    }

    public void setCurrentPassenger(int currentPassenger) {
        this.currentPassenger = currentPassenger;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

그리고 버스 클래스에서는 부모 클래스인 대중교통 클래스에서 크게 다르게 설정해줄 것이 없어서 일단 생성자만 만들어 주었는데 사실 맞게 한건지 잘 모르겠다 ㅎㅎ
버스 객체가 생성될 때 가져갈 값이 state를 "운행"으로 해줘야했고
busNum 에 입력하는 번호가 부모 클래스의 num 값이 되므로
super.num으로 해주었다. 또한 최대승객수와 기본요금은 버스와 택시가 다르므로 객체가 생성될 때 다르게 들어가도록 설정해주었다.
시나리오상 기본 현재 승객이 26인 것 같아서 그것도 넣어주었다.

public class Bus extends PublicTransportation {

    public Bus(int busNum) {
        super.startOperation("운행");
        super.num = busNum;
        super.maxPassenger = 30;
        super.price = 1000;
        super.currentPassenger = 26;
        System.out.println(busNum + "번 버스가 생성되었습니다.");
    }
}

택시 클래스는 사실 제대로 구현해내지 못했다 메소드나 다른 것들을 다 만들어주긴 했는데 출력했을 때 시나리오대로 출력되질 않는 걸 보면 중간에 어떤 문제가 있는 것 같긴하다,,

일단 택시는 버스와 다르게 택시 클래스 내에서 새로 선언해줄 필드도 많았고 메소드도 많았다. 객체가 생성될 때 목적지, 목적지까지 거리, 기본 거리, 기본 요금, 기본 거리까지의 요금을 다 선언해주었다.

메소드도 부모 클래스에서 오버로딩해줬던 승객탑승 메소드를 다시 오버라이딩해줘서 기본 거리가 넘어갔을 때 거리당 요금 추가 메소드가 실행되게 했다

요금 결제하는 메소드도 만들어줬고 부모 클래스의 상태 변경 메소드도 오버라이딩해서 다르게 설정해줬다.

public class Taxi extends PublicTransportation {
    String destination;
    int distanceDestination;
    int distanceDefault = 1;
    int defaultPrice = 3000;
    int distancePrice = 1000;

    public Taxi(int taxiNum) {
        super.startOperation("일반");
        super.num = taxiNum;
        super.currentPassenger = 0;
        super.maxPassenger = 4;
        System.out.println(taxiNum + "번 택시가 생성되었습니다.");
    }

    @Override
    public void boardingPassenger(int newPassenger, String destination, int distanceDestination) {
//        super.boardingPassenger(newPassenger, destination, distanceDestination);

        if (distanceDestination > 1) {
            distanceMoneyPlus(distanceDestination);
        }
    }

    // 거리당 요금 추가
    public void distanceMoneyPlus(int distanceDestination) {
        price = 3000 + (distanceDestination - 1) * 1000;
        System.out.println("지불할 금액 = " + price);
        System.out.println("상태 = " + state);
    }

    // 요금 결제
    public void payment() {
        System.out.println("현재 금액은 " + getPrice() + "원 입니다.");
        this.currentPassenger = 0;
    }

    @Override
    public void changeState() {
        super.changeState();
        if (fuelVolume < 10) {
            this.state = "운행불가";
        }
    }

    public String getDestination() {
        return destination;
    }

    public void setDestination(String destination) {
        this.destination = destination;
    }

    public int getDistanceDestination() {
        return distanceDestination;
    }

    public void setDistanceDestination(int distanceDestination) {
        this.distanceDestination = distanceDestination;
    }

    public int getDistanceDefault() {
        return distanceDefault;
    }

    public void setDistanceDefault(int distanceDefault) {
        this.distanceDefault = distanceDefault;
    }

    public int getDefaultPrice() {
        return defaultPrice;
    }

    public void setDefaultPrice(int defaultPrice) {
        this.defaultPrice = defaultPrice;
    }

    public int getDistancePrice() {
        return distancePrice;
    }

    public void setDistancePrice(int distancePrice) {
        this.distancePrice = distancePrice;
    }
}

택시 부분의 시나리오는 조금 아쉽지만 그래도 객체지향 프로그래밍을 이해하는데는 정말 큰 도움이 된 것 같다.
private이나 등등 아직도 갈 길이 멀지만 ㅜㅜ

다음으로 다룰 주제는,

JVM - Java Virtual Machine(JVM)

그대로 해석하면 자바를 실행하기 위한 가상 기계라고 할 수 있다.

Java는 OS에 종속적이지 않다는 특징이 있는데 이를 위해서는 OS 위에서 Java를 실행 시킬 무언가가 필요하고 그게 바로 JVM이다.

Java 소스코드 (*.java)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을 해줘야한다.

하지만 Java는 이 JVM 이라는 가상머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환된다.

여기서 Java Compiler는 JDK를 설치하면 bin에 존재하는 javac.exe를 말한다

변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는데,
이 때 JVM이 OS가 bytecode를 이해할 수 있도록 해석해준다.
따라서 Byte Code는 JVM 위에서 OS 상관없이 실행될 수 있는 것이다.

출처:https://jwjwj.tistory.com/23

이번주도 열심히 보냈다~! 다음주도 화이팅~!

0개의 댓글