❓패키지란?
- 자바에서 관련있는 클래스들끼리 묶음을 뜻한다.
- 예) java.lnag 패키지
- java 설계에 필요한 기본적인 클래스들이 들어있다.
- 패키지를 사용하므로써 클래스명 충돌, 관련있는 클래스들끼리 모여있으므로 유지보수 하기 좋은 코드를 작성할 수 있다.
❓도메인기준/레이어기준으로 묶는 기준은?
- 도메인 기준
- 도메인(비즈니스의 주체영역)으로 패키지를 나누었다.
- 도메인별로 모여있어서 비즈니스 로직을 이해하기 쉽다.
- 레이어 기준
- 타입기준으로 묶였으며, 비슷한역할들이 모여있어 관심사의 분리가 된다.
- 타입기준으로 모여있다보니 비즈니스 로직상 규모가 큰 도메인이 있다면 도메인별 응집도가 낮다.
❓접근제어자란?
클래스, 생성자, 필드, 메소드에대한 접근 권한을 제한하는 역할
- public
- 제한 대상 : 클래스, 생성자,필드, 메소드
- 접근 제한 범위가 없다.
- 클래스 생성 시 기본 제어자가 public이다.
- getter, setter
- protected
- 제한 대상 : 생성자, 필드, 메소드
- 같은 패키지 내에 있거나 상속 받은 경우만 접근 가능
- 하위 클래스가 상위클래스가 속해있는 패키지와 다른 패키지에 들어있어도 메소드나 생성자와 같은 클래스 안에 있는것을 상속할 수 있게 한다.
- package-private
- 제한 대상 : 클래스, 생성자, 필드, 메소드
- default접근 제어자이며 적어주지 않았을 경우.
- 같은 패키지 내에 있을때만 접근이 가능하다.
- private
- 제한 대상 : 생성자, 필드, 메소드
- 해당 클래스 내에서만 접근 가능
- 인스턴스 변수, 외부에서 호출하면 안되는 메소드
❓왜 접근제어를 해야할까?
객체지향에서 정보은닉(data hiding)을 위해 접근제어자를 사용한다. 외부에서 굳이 알 필요가 없는 정보를 숨기거나, 불필요한 수정이 일어나지 않도록 보호하기 위해서이다.
예) 객체지향 프로그래밍에서 필드에 대한 접근을 private으로 선언하여 외부로부터의 접근을 제한한다. 또한 메소드(getter, setter메소드)를 통해 데이터를 읽기, 쓰기를 권장한다.
❓getter, setter를 다 열어둔다면 접근제어를 않는것과 동일하지 않을까?
getter, setter를 모든필드에 대해 생성한다면 외부에서 필드에 직접적인 접근이 가능해져 객체의 무결성이 깨질 수 있다.
❓(encapsulation) 캡슐화의 장/단점
- 장점
- 데이터 보호
- 캡슐화를 통해 프로그램 실행하는 사람으로 하여금 행위에 대해 알지못하게 하여, 데이터 변경에 대한 위험으로 부터 보호한다.
- 재사용성
- 메소드(getter, setter) 를 통한 캡슐화 구현을 통해 코드 재사용성을 가질 수 있다.
- 단점
- 코드 길이
- 캡슐화를 위해 작성한 코드에 의해 코드가 길어 질 수있다.
❓상속이란?
상위객체(부모)와 하위역할(자식)객체를 나누어 상위객체의 필드 및 기능을 하위 객체에 물려주어 사용할 수 있도록 하는것.
- 상속은 보통 1~2단계정도로 상속하는것을 권장한다.
- 상속의 장점
- 코드가 중복되는것을 방지
- 일련의 클래스를 위한 공통적인 규약이 정의됨
❓어떨 때 쓰는게 좋을까?
http://www.c-jump.com/bcc/c123c/Week03/Week03.html
상위클래스는 추상적이고 하위클래스는 구체적일 경우 상속으로 구현할 수 있다. 하위클래스들의 공통 기능을 모아 상위 클래스로 공통화 할 수 있기때문이다. 코드를 공통적으로 관리할 수 있기 때문에 코드 추가 및 변경에 용이하다.
❓오버라이딩과 오버로딩?
Overriding
오버라이딩은 상속에서 하위클래스에서 메소드의 역할을 변경하거나 확장할 필요가 있을때, 상속받은 메소드를 새로 정의하는것을 뜻한다.
→ 그럼 어떤 메소드를 오버라이드 해야하나?
특정 하위클래스 유형에만 적용되는 메소드 구현이 필요할때 오버라이딩을 한다.
method overloading
- 메소드의 이름이 같지만, 매개변수만을 다르게 하여 정의하는것을 오버로딩이라 한다.
- 매개변수의 개수가 같아도 타입의 순서가 다르면 다른 메소드로 인식된다.
- 개수, 타입, 순서중 하나만 다르면 다 다른 메소드로 인식.
- 메소드 오버로딩의 모토 : 같은 역할을 하는 메소드는 같은 메소드 이름을 가져야 한다.
- 자바의 대표적은 메소드 오버로딩 예시
- System.out.println() : 매개변수가 다양한 타입을 print하는 동일한 역할을 다양한 매개변수 받는 메소드로 오버로딩 하였다.
❓상속이 권장되지 않는 상황
- 상속을 하여 상위클래스의 내용이 하위 클래스로 하여금 변경되지 않아야 할때. → final키워드를 사용하여 상속을 막는다.
❓IS-A, HAS-A
어떤것이 다른것을 확장하는지 알고싶을때 A는 B이다테스트를 한다.
예) 삼각형은 도형이다.
고양이는 고양이 과이다.
욕조는 화장실이다. → 욕조와 화장실사이에 관계가 없는것은 아니지만 상속 관계가 아니다. 화장실에는 욕조가 들어간다고 할 수 있다.
A는 B이다가 성립하고 상위가 하위들의 추상화일 경우 상속할 수 있다.
❓계층구조가 복잡해지면 어떤 일이 발생할까?
❓만약 100단 상속이 된 클래스에서 100번의 오버라이딩이 발생한 상황에서 버그가 발생했다면 트러블슈팅이 간단할까?
부모클래스가 변경되었다면 부모클래스를 상속받은 100단 상속된 클래스를 모두 수정해야하여 트러블 슈팅이 간단하지 않다.