코드스테이츠 13일차

안형준·2022년 5월 12일
0

코드스테이츠

목록 보기
13/32
post-thumbnail

1차 학습목표

  1. 자바 객체지향 프로그래밍의 핵심 개념과 원리를 이해할 수 있다.
  2. 자바 상속의 핵심개념을 이해하고 포함 관계와의 차이를 구별할 수 있다.
  3. 자바 캡슐화를 구현하기 위한 수단으로 접근 제어자와 getter/setter 메서드를 이해하고 활용할 수 있다.
  4. 다형성을 위한 참조변수의 형변환을 이해하고, 코드 예제를 통해 다형성의 핵심 내용과 효과를 이해하고 활용할 수 있다.
  5. 추상 클래스와 인터페이스를 통해 추상화가 어떻게 실현될 수 있는 지 이해하고 이를 활용할 수 있다.
👻상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미한다.
하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받게 되어 하위 클래스의 멤버 개수는 언제나 상위 클래스의 그것과 비교했을 때 같거나 많다.
그러므로 상속받았다라는 표현보다는 ~클래스로 부터 확장되었다 라고 생각하자

왜 상속을 사용할까?
상속을 통해 클래스를 작성하면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다.
그리고 하나의 객체가 여러 모양으로 표현될 수 있다는 장점도 있다.(다형성)

class Dancer extends Person { // Person 클래스로부터 상속
위와 같이 사용 가능하다.
}

👻포함 관계
포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 말한다.

클래스를 상속으로 할지 포함으로 할지 잘 모르겠다면
~는 ~이다. = 상속
~는 ~를 가지고있다. = 포함
위와같이 생각하자

👻메서드 오버라이딩
매서드 오버라이딩(Method Overriding)은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 말한다.

메서드 오버라이딩의 조건은?
1. 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.
2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

👻super 키워드와 super()
super 키워드는 상위 클래스의 객체, super()는 상위 클래스의 생성자를 의미한다.

this()와 super()의 차이는?
this()가 같은 클래스의 다른 생성자를 호출하는데 사용하는 반면, super()는 상위 클래스의 생성자를 호출하는데 사용된다.
this()와 마찬가지로 생성자의 첫 줄에는 반드시 super()가 선언되어야 한다.
만약 super()가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입하는데, 이때 상위클래스에 기본생성자가 없으면 에러가 발생하게 된다.
그러므로 클래스를 만들 때는 항상 자동적으로 기본 생성자를 만들자

👻클래스의 정점, Object 클래스
Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스이다.
따라서 자바의 모든 클래스는 Object 클래스를 상속받는다.
실제로 자바 컴파일러는 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동적으로 extends Object를 추가하여 Object 클래스를 상속받도록 한다.

👻캡슐화
캡슐화란 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말한다.

캡슐화를 사용하는 목적은?
첫 째는 데이터 보호의 목적이고, 두 번째로 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지하기 위함이다.

👻패키지
패키지란 특정한 목적을 공유하는 클래스와 인터페이스의 묶음이다.
// 패키지를 생성했을 때
package practicepack.test; // 패키지 구문 포함. 패키지가 없다면 구문 필요없음

public class PackageEx {

}
위에 코드와 같이 패키지가 있는 경우 소스코드 구문을 표시해주어야 한다.

우리가 주로 사용하는 String 클래스의 실제 이름은 java.lang.String이고, 여기서 java.lang이 패키지명이고 점(.)을 사용하여 디렉터리 계층구조를 나타낸다.

이렇게 패키지로 클래스를 묶어놓는 것의 또 하나의 장점은 같은 클래스의 이름을 가지고 있더라도 다른 패키지에 포함되어 있으면 협업 시 같은 클래스를 사용한다고 하더라도 구별이 가능해서 충돌을 방지할 수 있다.

👻Import문
Import문은 다른 패키지 내의 클래스를 사용하기 위해 사용하며, 패키지 구문과 클래스문 사이에 작성한다.
import 패키지명.클래스명; 또는 import 패키지명.*;
먼저 import 키워드를 써주고 패키지명과 패키지명을 생략하고자하는 클래스명을 함께 써주면 된다.
만약 같은 패키지에서 여러 클래스가 사용될 때는 import문을 여러번 사용하기보다는 import 패키지명.* 으로 작성하면 해당 패키지의 모든 클래스를 패키지명 없이 사용 가능하다.

👻제어자
자바에서 제어자는 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드를 의미한다.

접근 제어자(Access Modifier)란?
접근 제어자를 사용하면 클래스 외부로의 불필요한 데이터 노출을 방지(data hiding)할 수 있고, 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다.
private   동일 클래스에서만 접근 가능
default   동일 패키지 내에서만 접근 가능
protected   동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
public   접근 제한 없음

👻getter와 setter 메서드
객체지향의 캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우는 어떻게 할 수 있을까?
이런 경우 우리는 getter와 setter 메서드를 사용할 수 있다.
setter 메서드는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주고 일반적으로 메서드명에 set-을 붙여서 정의한다.
getter 메서드는 특정 데이터를 읽어오는 데 사용하는 메서드이다.

오늘은 상속, 캡슐화에 대한 개념을 학습했다.
객체지향이라는 어려운 개념을 굳이 왜 사용해야 할까 라는 의문도 조금씩 있었는데, 오늘 상속, 캡슐화를 통해 아! 이렇게 효과적으로 코드를 줄이고, 데이터를 보호할 수 있다면 아무리 어려워도 열심히 배울 가치가 있구나 라는 생각이 들었다.
점점 자바에 대해 깊숙한 부분까지 공부를 하면서 자바와 친해지고 있다는 생각과 더불어 조금은 무섭기도 하다.
그래도 열심히 하다보면 언젠가는 이 모든 것들을 보상 받을거라고 믿는다.
오늘도 고생했고 내일도 파이팅!

profile
개발 공부

0개의 댓글