코드스테이츠 백엔드 16일차 | 객체지향 프로그래밍 기초 ~ 심화 총 정리

hyoreal·2022년 7월 13일
0

CodeStates

목록 보기
17/32

오늘을 마지막으로 객체지향프로그래밍의 수업이 끝난다. 워낙 어렵고 이후에 스프링 등을 배울때 자주 쓰이는 부분이라 하시니 총 정리를 하면서 스스로 개념정리를 해야할것같아 오늘 풀로 주어진 블로김 및 심화실습시간을 이용하려고한다.
뿐만 아니라 심화실습을 하며 어려웠던 부분도 정리할것이다!
이러다 보니 아무래도 내용이 많이 길어지겠지만 뿌셔보자!!


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


ㅋ - **객체(Object)** 에 기반한 프로그래밍 패러다임. - 객체 : 모든 실재하는 것.(ex. 사람, 동물, 무생물, 논리, 사상 등) - **객체지향 프로그래밍** : 프로그래밍에서 필요한 데이터들을 모아 추상화시켜 _속성_ 을 가진 객체를 만든 후 객체들의 유연한 상호작용으로 _기능_ 을 구성하는 프로그램.
  • 객체지향 프로그래밍 생긴 이유?

    • 실제 세계의 속성과 기능을 분석하여 객체와의 상호작용을 프로그래밍에서 구현하기 위함.
  • 객체지향 프로그래밍은 절차지향적 프로그래밍이다.

  • 객체지향 프로그래밍 장점?

    • 기존 코드를 통해 새로운 코드 작성 가능.
    • 코드마다의 관계를 통해서 쉽게 코드 변경 가능.
    • 유지보수 유용.

    객체지향프로그래밍 참고자료


클래스와 객체

  • 클래스(Class) : 객체지향프로그래밍에서의 클래스는 객체의 설계도 혹은 설계도의 틀 과 같다.

    • 클래스 정의에 기반하여 객체를 생성하기 때문.

    • 객체는 클래스에 정의되고 설계된 내용 그대로 생성.

    • 붕어빵과 붕어빵기계와도 자주 비교한다.

  • 위 그림과 같이 틀(설계도)는 class라고 할 수 있으며, object는 class를 통해 생성해 내는 것이다.

  • 주의❗ 클래스는 객체 그 자체가 아님. 오직 객체를 만들어주는 틀.

  • 위 그림을 보면 클래스인 자동차설계도를 통해 객체인 자동차들이 생성됐다.

  • 클래스를 통해 생성된 객체를 클래스의 인스턴스라고 한다.

  • 클래스를 통해 객체를 생성하는 과정을 인스턴스화라고 한다.

  • 혼돈주의❗ 객체와 인스턴스의 차이?

    • 객체와 인스턴스는 거의 같은 의미이지만 굳이 구분한다면 객체 안에 인스턴스가 포함된다고 보면 된다.

    • 객체는 모든 인스턴스를 포괄하고, 인스턴스는 해당 객체가 어떤 클래스로부터 만들어진것인지 강조한다.

      • 위에 차 그림을 보면 각각의 Audi, Nissan, Volvo는 객체라고 할 수 있고, 더 구체적으로 설명하면 Car클래스로부터 만들어진 Audi, Car클래스로부터 만들어진 Nissan, Car클래스로부터 만들어진 Volvo 라는 의미로 Car클래스의 인스턴스라고 할 수 있다.

  • 클래스 정의가 중요한 이유?

    • 눈사람을 하나하나씩 만든다면 굉장히 힘들고 오래걸리지만 잘 만들어진 틀을 이용하면 쉽고 빠르게 무한대로 만들어 낼 수 있다.
    • 클래스도 이와 마찬가지. 클래스를 정의할때 잘 정의하면 객체를 생성할 때 마다 클래스로부터 객체를 생성해서 사용하면 된다.
  • 위의 Car 그림을 코드로 나타내면 이와 같다.


- 클래스는 4개의 요소로 구성되어있는데 각각 필드(Field), 메서드(Method), 생성자(Constructor), 이너클래스(Inner class)라고 한다.

  • 생성자를 제외한 나머지 3개의 요소는 멤버라고 한다.
    • 클래스의 멤버는 new키워드를 통해 접근할 수 있다.
  • 위 코드에서 속성부분은 변수(Variable), 기능은 메서드(Method)라고 한다.

필드

  • 객체의 속성(state)를 정의한다.

  • 필드에는 각각 클래스 변수, 인스턴스 변수, 지역 변수가 존재한다.

  • 변수마다 선언된 영역에 따라 이름이 바뀌고, static유무에 따라 바뀐다.

class Example { // 클래스 영역
  int instanceVariable; // 인스턴스 변수
  static int classVariable; // 클래스 변수
  
  void method() { //메서드 영역
    int localVariable = 0; // 지역변수. 메서드{} 안에서만 유효.
  }
}
  • 위 예시 코드와 같이 클래스 영역에서 선언될때 static 유무에 따라 인스턴스 변수와 클래스 변수가 나뉘고, 메서드 영역에서 선언된 변수만이 지역변수이다.
  • 클래스는 클래스 영역에 저장.

  • 참조변수는 스택 메모리 영역에 저장.

    • 참조변수는 객체의 실제값이 아닌 주소값 저장.
  • new 생성자는 힙 메모리 영역에 저장.

    • 객체 내부에 필드, 이너클래스 존재.
    • 객체에서 메서드를 호출하게 되면 클래스영역에 있던 메소드 출력.
  • 지역변수는 스택 메모리 영역 에 저장된다.
  • 필드는 힙 메모리 영역 에 저장된다.

메서드 (Method)

  • 객체의 기능(behavior)을 정의한다.

  • 특정 작업을 수행하는 실행문들의 집합이다.

  • 메서드 시그니처(signature)와 메서드 바디(body)로 구분된다.

public static int add(int x, int y) { // 메서드 시그니처
  int result = x + y; // 메서드 바디
  return result;
}
  • 메서드 반환 타입이 void가 아닐땐 반드시 메서드 바디 안에 return 필요.

메서드 오버로딩 (Method Overloading)

  • 메서드 오버로딩 : 하나의 클래스 안에 중복되는 이름의 메서드들을 정의하는것.

  • 메서드 오버로딩 조건

    • 메서드 명이 같을것.
    • 매개변수의 개수나 타입이 달라야할것.

    필드와 메서드 참고자료

생성자(Constructor)

  • 인스턴스 생성 시 호출되는 인스턴스 변수 초기화 메서드

    • 이름이 생성자라고 해서 인스턴스를 생성하는게 아님
  • new가 인스턴스 생성을 하며 참조변수에 주소값을 저장하고, 생성자는 new로 생성된 인스턴스 변수를 초기화한다.

  • 오버로딩 가능.

  • 생성자와 메서드의 차이

    • 생성자는 반드시 클래스와 이름이 같아야함.
    • 생성자는 리턴타입이 없음.
  • this() : 자신이 속한 클래스에서 다른 생성자 호출

    • this()는 반드시 생성자 내부에서 사용.
    • this()는 생성자의 첫 줄에 위치해야함.
  • this : 인스턴수 변수와 매개변수 구분. this.가 붙은 변수는 인스턴스 자신의 변수를 가리킴.

생성자 참고 자료

이너클래스(Inner class)

  • 이너클래스는 내부클래스와 같은 말.

  • 이너클래스 : 클래스 내에 선언된 클래스.

  • 내부 클래스를 통해 외부 클래스의 멤버에 쉽게 접근 가능.

  • 캡슐화 달성에 유용.

  • 내부클래스는 3가지가 있음.

    • 인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스
  • 인스턴스 내부 클래스

    • 선언위치 : 외부클래스의 멤버변수 선언 위치에 선언.(멤버 내부클래스)
    • 사용가능변수 : 외부 인스턴스 변수, 외부 전역변수
  • 정적 내부 클래스

    • 선언위치 : 외부클래스의 멤버변수 선언 위치에 선언.(멤버 내부클래스)
    • 사용가능변수 : 외부 전역 변수
  • 지역 내부 클래스

    • 선언위치 : 외부 클래스의 메서드나 초기화 블럭 안에서 선언.
    • 사용가능변수 : 외부 인스턴스 변수, 외부 전역 변수
  • 익명 내부 클래스

    • 선언위치 : 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스.
    • 사용가능변수 : 외부 인스턴스 변수, 외부 전역 변수

TRPG 프로그래밍

  • TRPG 프로그래밍을 하는데 다른건 괜찮았지만 class 와 다른 class를 연결하는게 어려웠다.

  • LoL_char 클래스를 이용하여 LoL_Program 클래스에서 새로운 인스턴스를 생성하는게 이론상으로는 이해했지만 실제로 사용하려니 복잡하게 느껴졌었다.
  • LoL_char 클래스는 유닛의 정보들이 담겨있는 class이고, LoL_Program 클래스는 게임실행을 하는 class인데 처음 배우는 내용들이다보니 여러 정보들이 머릿속에서 섞여 자꾸 이상한 방법으로 하려 했다.
  • 한참을 고민하다보니 LoL_char class로 새로운 객체를 만들어 사용하면 되겠다는 생각이 들었고 그제서야 new메서드를 사용하여 새로운 인스턴스를 만들었다.
  • 아직 실무까지는 한참 모자란것같지만 이제 2주정도 지났으니 남은 시간은 많다.
  • 그 시간동안 더 빨리 성장하고싶다.

객체지향 프로그래밍의 4가지 기둥

  • 객체지향프로그래밍 설계를 지탱하는 핵심 4가지가 있다.
  • 각각 캡슐화, 상속성, 추상화, 다형성으로 이뤄져있다.
    • 쉽게 외우는 팁?
      • 캡! 상추다! 로 외우면 정말 잊을수가 없다.🤣

상속

  • 상속 : 자바에서의 상속은 기존 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법요소이다.

  • 상위(부모)클래스 - 하위(자식)클래스 로 이뤄진다.

  • 하위클래스는 상위클래스의 모든 멤버를 상속받는다.(확장되는게 더 잘맞다고 본다.)

  • extends 키워드를 통해 상속할수있다.

  • 다른 언어에서는 다중상속이 가능하지만, 자바에서는 단일 상속만이 가능하다.

  • 상속의 장점

    • 코드의 중복을 없애준다.
    • 더 적은 코드로 많은 기능을 작성할수있다.
    • 다형적 표현이 가능하다.

포함관계

  • 포함(composite) : 클래스의 멤버로 다른 클래스 타입의 참조변수 선언.

  • 상속과 포함관계 헷갈릴 가능성多

    • 상속 : 클래스간의 관계가 "~는 ~이다(IS-A)"관계
    • 포함관계 : 클래스간의 관계가 "~는 ~를 가지고 있다(HAS-A)" 관계

메서드 오버라이딩(Method Overriding)

  • 메서드오버라이딩 : 상위클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는것

  • ❗❗메서드 오버로딩과 메서드 오버라이딩의 차이❗❗

    • 메서드 오버로딩은 같은 이름의 메서드를 새로 만드는것.

      public class OverloadingTest{
        public static void main(String[] args) {
          OverloadingMethods olMethods = new OverloadingMethods();
      
            olMethods.print();
            olMethods.print(1);
            olMethods.print(2,3);
            olMethods.print(4.0);
        }
      }
      class OverloadingMethods {
        public void print() {
            System.out.println("난 오버로딩");
            System.out.println("-".repeat(15));
        }
        public void print(int a) {
            System.out.println("이 몸이 오버로딩이시다!");
            System.out.println(a);
            System.out.println("-".repeat(15));
        }
        public void print(int b, int c) {
            System.out.println("꿇어라. 이것이 오버로딩이다.");
            System.out.println(b +","+ c);
            System.out.println("-".repeat(15));
        }
        public void print(double d) {
            System.out.println("오버로딩은 이렇답니당");
            System.out.println(d);
            System.out.println("-".repeat(15));
        }
      }
      
      출력결과
      난 오버로딩
      ---------------
      이 몸이 오버로딩이시다!
      1
      ---------------
      꿇어라. 이것이 오버로딩이다.
      2,3
      ---------------
      오버로딩은 이렇답니당
      4.0
      ---------------
      

    • 메서드 오버라이딩은 상위클래스의 기존 메소드를 하위클래스에서 재정의 하는것.

      public class OverridingTest {
           int age;
           String name;
           Address address;
      
         public OverridingTest(int age, String name, Address address){
             this.age = age;
             this.name = name;
             this.address = address;
         }
         void showInfo() {
             System.out.println("저는 " + name + "이고 나이는 " + age + "살 입니다.");
             System.out.println("나라는 " + address.country + "이고, 지역은 " + address.city + "입니다.");
         }
         public static void main(String[] args){
             Address address1 = new Address("한국", "서울");
             Address address2 = new Address("미국", "워싱턴 D.C");
      
             OverridingTest dotdot = new OverridingTest(20 , "김땡땡", address1);
             OverridingTest nana = new OverridingTest(30, "박나나", address2);
             
             dotdot.showInfo();
             System.out.println("-".repeat(15));
             nana.showInfo();
         }
      }
         class Address {
           String city, country;
      
         public Address(String country, String city) {
             this.city = city;
             this.country = country;
         }
      }
      출력결과
      저는 김땡땡이고 나이는 20살 입니다.
      나라는 한국이고, 지역은 서울입니다.
      ---------------
      저는 박나나이고 나이는 30살 입니다.
      나라는 미국이고, 지역은 워싱턴 D.C입니다.
  • 메서드 오버라이딩 조건

    • 메서드의 선언부(메서드명, 매개변수, 반환타입)이 상위클래스와 완전히 같아야함
    • 접근제어자의 범위가 상위클래스의 메서드보다 같거나 넓어야함
    • 예외는 상위 클래스의 메서드보다 많이 선언할 수 없음.
  • super : 상위 클래스의 객체

  • super() : 상위 클래스의 생성자 호출

Object 클래스

  • Object클래스는 자바 클래스의 상속계층도 최상위에 위치한 상위 클래스.
  • 자바의 모든 클래스는 Object클래스로부터 확장됨.

상속 참고자료1

상속 참고자료2

상속 참고자료3

캡슐화

  • 캡슐화
    • 외부로부터 클래스에 정의된 속성과 기능을 보호(데이터 보호)
    • 외부에는 필요한 부분만 노출(데이터 은닉)
  • 캡슐화를 하기위해 필요한 접근제어자, getter/setter메서드.

Getter/Setter

  • setter : 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해준다.
  • getter : setter로 설정한 변수값을 읽어오는데 사용한다.

캡슐화 참고자료

캡슐화 참고자료2

다형성

  • 다형성 : 하나의 객체가 여러가지 형태를 가질 수 있는 성질
  • 자바에서의 다형성 : 상위클래스 타입의 참조변수를 통해서 하위클래스의 객체를 참조할 수 있도록 허용한 것.
    • 상위클래스의 타입으로 하위클래스타입의 객체를 참조하는 것은 가능하지만 반대는 성립하지 않음.
  • 오버로딩과 오버라이딩도 다형성의 한 예시

참조변수의 타입 변환

  • 참조변수의 타입 변환 : 사용할 수 있는 멤버의 개수를 조절하는 것.

  • 타입변환 조건

    • 서로 상속관계에 있는 상위클래스 - 하위클래스 사이에서만 타입변환이 가능.
    • 하위클래스타입에서 상위클래스 타입으로의 타입변환(업캐스팅)은 형변환 연산자를 생략 가능.
    • 상위클래스타입에서 하위클래스 타입으로의 타입변환(다운캐스팅)은 형변환 연산자 필요.

instanceof 연산자

  • instanceof 연산자는 참조변수의 타입변환(캐스팅)의 여부 파악.

다형성 참고자료

다형성 참고자료 2

추상화

  • 추상화 : 기존 클래스들의 공통적인 요소들을 뽑아서 상위클래스를 만들어내는것
    • 상속과 반대개념
    • 추상클래스와 인터페이스를 통해 추상화 구현

추상클래스

  • 추상클래스 : 메서드시그니처만 존재하고 바디가 선언되지 않은 추상메서드를 포함하는 미완성 설계도

  • 반드시 추상메서드가 한개이상 있어야함.

  • abstract키워드 사용.

  • 추상클래스는 상속관계에 있어 새로운 클래스를 작성하는데 매우유용

  • 추상클래스 장점?

    • 각각 상황에 맞는 메서드 구현 가능.
    • 추상화를 구현하는데 핵심적인 역할
  • 상속계층도의 상층부에 위치할수록 추상화정도가 높고, 내려갈수록 구체화된다.

인터페이스

  • 인터페이스 : 추상 클래스보다 높은 추상성. 밑그림, 깡통, 껍데기
  • 추상메서드들의 집합.
    • 예외 : static/default 메서드와 상수
  • Interface 키워드 사용
  • 역할과 구현의 구분
  • 위 그림은 예로, Provider클래스에 의존하는 User클래스가 있다고 가정.

  • 만약 Provider 클래스를 Provider2,3.....로 변경할경우 변경할때마다 User 클래스 변경해야함.

  • 이 경우 인터페이스가 Provider클래스를 감싸고 User클래스를 연결시켜두면 User을 매번 변경할 필요 없음.

  • 이와같이 인터페이스는 역할과 구현을 분리시켜줌.

추상화 참고자료

추상화 참고자료2


이렇게 오늘 하루종일 객체지향프로그래밍을 정리했다.
물론 뿐만아니라 심화실습 문제들도 풀었지만 시간이 너무 오래걸릴것같아 내일 작성하려고 한다.

profile
좌충우돌 코린이 성장기

0개의 댓글