[WIL 23.01.29] 객체지향 파트2

이승렬·2023년 1월 29일
0

항해99

목록 보기
19/34
post-thumbnail

2주차가 끝났다..
이제 완전히는 아니지만, 자바에 익숙한 단계인 것 같다.

이번주에서 제일 중요했던 객체지향 개념을 WIL 로 정리하겠다.

Q1. 상속이 뭐야?

  • 기존 클래스로 새로운 클래스를 작성하는 것이다. (즉, 코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것이다

이때 형식은 다음과 같다.

class 자식클래스 extends 부모클래스 {/내용생략/}

Q2. 상속의 특징은?

  • 자손은 조상의 모든 멤버를 상속받는다. ( 이때 생성자와 초기화 블럭은 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다. (같거나 많다.)
  • 자손의 변경은 조상에 영향을 미치지 안흔다.

Q3. 클래스들간의 관계 (포함과 상속)

클래스의 관계는 다음 두가지로 나눌 수 있다.

  1. 상속
  2. 포함

상속은 앞에서 이야기를 했다시피 클래스들 간의 부모 자식 관계를 만들어 준 것이다.

이때 포함은 어떻게 될까?

포함

  • 클래스의 멤버로 참조변수를 선언하는 것이다.
  • 작은 단위의 클래스를 만들고 이들을 조합해서 클래스를 만든다.
  • c.p.x // c.p.y // c.r 로 접근한다.
  • 명시적 초기화로 인해서 객체 생성 후 참조변수에 대입한다.

클래스간 관계 설정

  • 상속관계: ~는 ~이다.

  • 포함관계: ~는 ~를 가지고 있다.

  • cf) 대부분은 포함관계이다. (왜냐면 상속은 제약이 많기 때문에 꼭 필요할 때만 사용한다.)

Q4. 단일 상속이 뭐야?

단일상속

자바는 단일상속만을 허용한다.
C++ 과 같은 경우에는 다중상속도 허용하지만, 자바는 단일 상속이다.

  • 이때 비중이 높은 클래스 하나만 상속관계이고, 나머지는 포함관계로 해결한다.

Object 클래스

Object 클래스는 모든 클래스의 조상이다.

이때 특징들을 살펴보자면

  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속 받음 (Object가 최고 조상)
  • 조상이 없는 클래스는 자동적으로 Object 클래스를 상속 받음 (extends Object 가 생략)
  • 모든 클래스는 Object 클래스에서 정의된 11개의 메서드를 상속을 받는다. (toString(), equals, hashCode()..)

Q5. 오버라이딩이 뭐야?

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

  • 조상의 메서드를 자신의 용도에 맞게 변경하는 것이다.
  • 이때 메서드의 선언부는 변경이 불가능하며, 내용만 변경이 가능하다.

오버라이딩에서의 주의사항

  • 선언부(이름, 매개변수, 리턴의 타입)가 조상 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상클래스의 메서드보다 많이 선언할 수 없다. (8장에서 나온다)

오버로딩 vs 오버라이딩

  • 오버로딩

  • 기존에 없는 새로운 메서드를 정의하는 것이다. (이름만 동일)

  • 상속과는 전혀 관련이 없다.

  • 오버라이딩

  • 상속받은 메서드의 내용을 변경하는 것이다.

Q6. 참조변수 super, 생성자 super()

참조변수 Super

  • super = 객체 자신을 가리키는 참조변수이다.
  • 인스턴스 메서드나 생성자에서만 사용가능하다.
  • 조상멤버와 자신의멤버를 구별할때 사용한다.

참조변수 this 와 참조변수 super

  • 조상의 멤버 : super.x;
  • 자신의 멤버 : this.x;

생성자 super()

  • 자손이 조상의 생성자를 호출할때 사용.

  • 조상의 멤버는 조상의 생성자가 초기화 하도록 해야한다.
    -> 조상의 멤버들을 어떻게 초기화를 해야할지를 가장 잘 아는 것은 조상이기 때문.

  • 생성자이 첫줄에는 반드시 생성자를 호출해야한다.

  • 첫줄에 생성자가 호출되지 않으면 컴파일러가 super() (기본생성자)를 삽입한다.

Q7. Package 와 Package 선언

Package

  • 서로 관련된 클래스의 묶음
  • 패키지는 폴더라고 생각하면 된다.
  • 실제 클래스의 full name은 패키지를 포함
    이 예시는 java.lang.String 과 같이, 생각하지 않고 String을 쓴거와 같은 말이다.

Package 선언

  • 소스파일의 첫번쨰 문장으로 단 한번만 선언된다.
  • 이때 패키지 선언이 없으면 디폴트 패키지에 속하게 된다.

Q8. import 문이 뭐임?

import 문

  • 클래스를 사용할 때 패키지 이름을 생략할 수 있음
  • 컴파일러에게 클래스가 속한 패키지를 알려줌
  • 패키지문 과 클래스 선언 사이에 위치함
  • 컴파일 시에 처리되므로 프로그램의 성능에 영향없음

static import문

  • static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해줌 (쓸까..?)
    => 이 부분은 실제로 많이 쓰이는 곳은 junit 이라고 한다.

Q9. 제어자,

제어자

  • "클래스"와 "클래스의 멤버"(변수, 메서드) 에 부가적인 의미 부여한다. (표면적 의미)

  • 하나의 대상에 여러 제어자를 같이 사용가능 (이떄, 접근 제어자는 하나만 )

접근 제어자

  • public
  • protected
  • (default)
  • private

Q11. 접근 제어자 외 것들 (static, final, abstract)

static: 클래스의, 공통적인

  • 멤버변수, 메서드에 붙일 수 있다.
  • 하지만 static 을 선언하면 그땐, iv, im(instance method) 사용이 불가능하다.

final: 마지막의, 변경될 수 없는

  • 정확히 말하자면, final 즉 상수값으로 바꾼다고 하는 것이다.
  1. final 클래스 -> 변경될 수 없는, 확장될 수 없는 클래스 즉 , 다른 클래스의 조상이 될 수 없다.

  2. final 메서드 -> 변경될 수 없는 메서드, 즉 오버라이딩 불가하다.

  3. 변수 -> 값을 변경할 수 없는 상수

abstract: 추상의, 미완성의

  1. abstract 클래스 -> 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.

  2. abstract 메서드 -> 선언부만 작성하고, 구현부는 작성하지 않은 추상 메서드 (미완성 메서드), 몸통이 없는 메서드

이때, 추상 메서드는 미완성이므로 그렇다면 자연스럽게 추상 클래스 또한 미완성 이다.
미완성 설계도는 제품 생성이 불가능하기 때문에
"객체 생성이 불가능"히다, 이때 상속을 통해 완성된 설계도로 객체 생성가능함을 알아두자.

Q12. 접근제어자 파해치기

접근제어자

  1. private : 같은 클래스(파일)안에서만 접근 가능.
  2. default : 같은 패키지(폴더)안에서만 접근 가능.
  3. protected : 같은 패키지 + "다른패키지" 에서는 "자식클래스 안"에서만 접근이 가능하다.
  4. public : 접근제한이 없다.

Q13. 접근제어자를 이용한 캡슐화

접근제어자를 사용하는 이유

  1. 외부로 부터 데이터를 보호하기 위해서
  • 보호해야하는 데이터는 "메서드"를 통한 간접접근을 할 수 있도록 한다.
  • 잘못된 데이터가 저장되는 것을 막기 위해서 직접접근 보다는 간접접근을 허용하는 것이다.
  1. 내부적으로만 사용하는 부분을 감추기 위해서

이때 접근제어자의 범위는 좁으면 좁을수록 좋다.

Q14. 다형성

다형성

  • "조상타입 참조변수"로 "자손타입 객체"를 다루는 것이다.

여기에서 알아둘 부분이 2가지가 있다. 이를 살펴보면 다음과 같다.

  1. 객체와 참조변수의 타입이 일치하지 않을 때
  • 참조변수와 객체의 타입이 일치하는 경우
    이때는 객체의 모든 멤버를 다룰 수 있다.

하지만 이때 조상 객체로 자손 객체를 다루는 경우 (객체와 참조변수의 타입이 일치하지 않을떄)는
조상이 가진 멤버만을 다룰 수 있다

  1. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
  • 자손이 다룰 수 있는 기능보다 부모가 가진 멤버가 적기 때문에 참조변수가 객체에 존재하지 않는 기능을 호출하는 경우 에러 발생한다.

Q15. 참조변수의 형 변환

참조변수의 형변환
: 사용할 수 있는 멤버의 개수를 조절하는 것이다. 즉 값이 바뀐다.

상속관계 참조변수는 서로 형변환 가능

  • 자손 -> 조상 사용 멤버의 개수 감소 (안전)
  • 조상 -> 자손 사용 멤버의 개수 증가 (안전하지 않음)
  • 하지만 형변환의 생략은 너무 신경쓰지 말고 그때그때 컴파일러가 시키는 대로 따르자.

Q16. instanceOf 연산자

instanceOf 연산자

사용의 목적은 결국 형변환을 안전하게 할 수 있다는 것이다.
형 변환을 하기 전에 instanceOf 연산자로 형변환 가능여부를 체크하자.

  • 참조변수의 형변환 가능여부 확인에 사용할 수 있다.(true/false)

  • 객체의 조상에 대해서도 '참' 값을 반환한다.

  • 참조변수를 변경함으로써 사용할 수 있는 멤버의 개수 조절가능
    - 이 말은 참조변수의 리모콘을 변경하고, 사용할 수 있는 멤버 수를 변경하겠다는 것이다.

Q17. 매개변수 다형성

다형성의 장점

  • 다형적 매개변수를 사용할 수 있다.
  • 원래는 하나의 배열에는 같은 종류의 객체가 들어가야 하지만, 하나의 배열로 여러 종류 객체 다룰 수 있다.

다형성 다시 정리

1) Tv t = new SmartTV();
2) 참조변수의 형변환 -> 리모콘 바꾸기, 사용가능한 iv 갯수 조절하는 역할.
3) instanceof 연산자 -> 형변한 가능 체크 기능을 함.

  • 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
    ex> Product(부모) - Computer(자식) 관계이고
  • Buyer 클래스에 void buy(Product p)라는 메서드가 정의되어 있을 때
class Buyer{
	void buy(Product p){// 내용생략 }
}
Buyer b = new Buyer();
Product p = new Tv1();
b.buy(p);

// 위의 내용들을 다음과 같이 한꺼번에 정리가 가능ㅎ다ㅏ.

b.buy(new Tv1()) // 익명클래스 이용하여 한줄로 가능

Q18. 추상클래스, 추상메서드

추상 클래스(abstract class)

  • 미완성 설계도, 미완성(추상) 메서드를 가진 클래스
  • 구현부가 없는 메서드
  • 인스턴스 생성이 불가능 -> 미완성 설계도이기때문에 제품 생성이 불가능하다.
  • 이때 중요한 것은 "상속" 을 통해 추상 메서드를 완성해야 인스턴스 생성이 가능하다.

추상 메서드 (abstract method)

  • 미완성 메서드, 구현부가 없음, 강의에서는 '몸통이 없는 메서드' 라고 부른다.

  • 양식: abstract 리턴타입 메서드이름();

  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상될 때 사용한다.

  • 인스턴스 메서드에서 추상 메서드를 사용할 수 있다.

  • 인스턴스 메서드가 호출되기 위해서는 인스턴스가 생성되야 하기 때문에 가능하다 (추상 메서드가 완성되어야 인스턴스가 생성 가능)

Q19. 추상클래스의 작성.

스탭을 밟으면서 어떻게 작성이 되는지 확인해보자.

  1. 일단 클래스가 여러개가 있다고 가정한다면
    이때 공통적인 부분을 추출하여 추상(abstract) 클래스를 만든다.
    결과적으로 코드의 중복이 제거되었고 간결해졌다. (추상클래스를 사용하는 이유)

2.이 추상클래스를 배열로하여 각 일반클래스들을 저장시킨다.

Unit[] group = {new tank[], new marin[], ... }; 
group[0].move(100,200);

cf)

Unit 을 조상인 Object 로 바꿔도 해당부분은 문제가없지만
Object 부분엔 move가 없기 때문에 구현부분에선 문제가 발생.

Q20. 추상클래스의 장점.

결론적으로 추상화를 하는 이유는 다음과 같다.

추상화된 코드는 구체화된 코드보다 "유연하다" , 즉 변경에 유리하다.

Q21. 인터페이스?

인터페이스
: 추상 메서드의 집합(프로그래밍 관점)

  • 구현된 것이 전혀 없는 설계도 (모든 멤버가 public, 즉 나중에 구현을 해줘)
  • 변수로 상수 (이때 상수는 final) 만을 가질 수 있음(모든 변수가 public static final)
  • 메서드 선언 시 public abstract 생략가능. (추상메서드만 가지니까..)
  • 인터페이스의 조상은 인터페이스만 가능. (class 를 조상으로 가질 수는 없다. Object 최고조상 아님)
  • 다중 상속이 가능하다. -> 추상 메서드는 충돌해도 문제가 없음 (어짜피 선언만하고, 구현은 안헀으니까)
  • 조상과 후손에 같은 이름의 상수 값이 존재하면 덮어씌워짐
  • implements 키워드 사용해 구현할 인터페이스 명시

추상 클래스와 인터페이스 차이점

  • 추상 클래스: 일반 클래스이지만 추상 메서드를 가진 클래스.

  • 인터페이스: 구현된 것이 아무것도 없이 추상 메서드만 가진다.

말로만 하면 이해가 안가니까, 가장 큰 차이를 이야기를 해보자면,

차이점 : 추상클래스는 생성자 및 iv 가 존재하지만, 인터페이스는 구현한 것이 아무것도 없이 추상메서드만 나열
공통점: 추상메서드를 가진다.

인터페이스 구현

정의된 추상메서드의 완성이다.

class ClassName implements InterfaceName {
   // 인터체이스에 정의된 추상메서드를 모두 구현해야 함
    // 일부만 구현할 경우 미구현에 abstract붙여라
}

Q22. 인터페이스와 다형성

이 부분은 많이 어렵고, 예시를 통해서 이해를 하는 것이 제일 빨라보인다.

  1. 인터페이스의 다형성
class Fighter extends Unit implements Fightable {
    public void move(int x, int y) {}
    public void atrack(Fightable f) {}
}

Unit u = new Fighter(); // 상속
Fightable f = new Fighter(); // 인터페이스

  • 리모콘이 인터페이스이기 때문에 인터페이스가 가지고 있는 멤버만 사용 가능하다.
  1. 만약 매개변수가 인터페이스라면? (이 부분이 가장 중요하고 어려움)
  • 해당 인터페이스를 implements로 (상속/구현) 된 클래스 모두 쓸 수 있다.
  1. 반환/리턴타입이 인터페이스라면?
  • 매개변수와 동일하다.
  • 즉, 상속혹은 구현된 클래스가 반환타입이 되는 것이다.이때 인터페이스도 물론 가능하다.
  • 반환타입이 인터페이스라는 것은 받는 쪽에서의 타입도 맞춰줘야한다.

Q23. 인터페이스의 장점

인터페이스의 장점
: 두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간역할(기계껍데기라고 생각하자.)

ex) GUI(Graphic User Interface)

  1. 알멩이가 바뀌어도 껍데기가 그대로면 사용에 아무 지장없다(변경에 유리)

  2. 선언(설계)와 구현을 분리시킬 수 있게 한다
    (즉, Provider가 변경되도 User는 안바꾸고 쓰기가 가능하다. 이를 느슨한 결합이라고 한다.)

  3. 개발 시간을 단축시킬 수 있다.

  • 실제 구현내용이 없어도, 인터페이스가 만들어져 있으면, 사용자는 메서드를 호출할 수 있다.
  • 즉 변경에 항상 유리한 설계가 가능하다.
  1. 표준화 가능
  • 그림을 그리면서 설명을 해주셨는데, MYSQL 과 Oracle DB 와의 호환성 그림을 생각하자.
  • JDBC: 데이터 베이스가 변경되더라도, 애플리케이션을 변경 안해도 된다는 이점
  1. 서로 관계가 없는 클래스들을 관계를 맺어줄 수 있다.
  • 서로 관계가 없는 클래스가 같은 인터페이스를 구현하도록 만들 수 있다.
profile
Backend_Developer

0개의 댓글