본문 바로가기

내일배움캠프

8일차 TIL

오늘의 공부 : Java 문법 종합반 3주차 완료 / 개인 과제 Level 2 완료

오늘도 내가 강의를 들으면서 새롭게 알게된 것 그 동안 애매했던 것을 오늘의 학습으로 정리하려고 한다.
오늘의 학습, 코드에 필요한 팁 , 오늘의 회고 이렇게 3개의 큰 틀로 나누어 정리할 것이다.

 

💡 오늘의 학습 키워드

접근제어자

상속 관계 /포함 관계

추상 클래스

다형성과 instanceof

추상클래스

인터페이스 (Interface)

SRP 단일책임 원칙

개방 폐쇄 원칙 - OCP (Open Closed Principle)

 

접근제어자

접근 제어자는 public default protected private가 있다. 

오른쪽으로 갈수록 좁은 접근을 가진다고 생각하면 좋다

public : 다른 패키지에서도 접근 가능

default : 동일 패키지 내에서만 접근 가능

protected : 상속 받은 클래스에서 접근 가능

private : 자기 클래스에서만 접근 가능(정보은닉)

 

○ 사용가능한 접근자

 - 클래스 : public  / default

 - 메서드 & 멤버 변수 : 모두 가능

 - 지역변수 : 접근제어자 사용 불가능

 

○ setter / getter

 - private의 경우 정보 은닉으로 자기 클래스 안에서만 사용가능

 - private의 데이터에 접근하기 위해 getter

 - pricate의 데이터를 수정하기 위해 setter

 

상속관계 / 포함관계

1. 상속 관계

① 상속관계란?

 -상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소로 상위 클래스의 멤버를 내려받아 하위 클래스 내부에 포함시키는 역할

 - 기존 클래스는 상위(부모) 클래스, 새로운 클래스는 하위(자식) 클래스

 - 하위 클래스는 상위 클래스로부터 확장

 

② 상속의 장점 

 - 코드의 중복성 제거 / 클래스의 다형적 표현 가능 /  다형성 : 1개의 객체를 여러 가지로 표현할 수 있는 특성

 

③ 상속 정의(사용 방법)

 - 클래스를 상속할 때는 'extends' 키워드를 사용한다.
 - 상위 클래스가 2개 이상인 다중 상속은 할 수 없다.

 

class 하위 클래스(자식)  extends 상위 클래스 (부모){

}

 

2. 포함관계

① 상속관계란?

 -포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 자료형의 참조 변수를 선언하는 것을 의미한다.

 

② 상속/포함관계 구분하기

  - 클래스 간의 관계가 '~은 ~이다.(IS-A)' 관계인지 '~은 ~을 가지고 있다(HAS-A)' 관계인지 생각해보기.

 - 상속관계 :  ~은 ~이다.(IS-A)

 - 포함관계 : ~은 ~을 가지고 있다(HAS-A)

 -ex) Person - IdCard : '아이디카드는 사람이다.(IS-A)' - X / '사람은 아이디카드를 가지고 있다.(HAS-A)' - O : 포함 관계

 

다형성(polymorphism)

① 다형성이란?

 - 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.

 - 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.

 - 다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다

 - 참조 변수의 다형성을 보여주는 예제입니다.

 

class Parent { ... }

class Child extends Parent { ... }
...
Parent pc = new Child();  // 허용(부모/자식)

Child cp = new Parent();  // 오류 발생.(자식/부모)

 

// 자식클래스 선언해서 부모 클래스 넣는건 허용 안됨
왜? 자식클래스가 변수나 메소드가 더 많기 때문에 비는게 생겨서!

 

   a instance of B :

a인스턴스가 B클래스로부터 상속받았는지에 대한 여부

 

추상 클래스

①  추상 클래스란?

-일부 메소드가 구현되지 않고, 선언만 되어있는 클래스
-자식 클래스에서 이것을 반드시 구현하게끔 강제하는 것
-필요한 모든 클래스가 구현될 수 있도록 하여 안정성을 높이는 효과를 가져온다.
-일반 클래스의 공통적인 부분을 추출해 어느정도 규격(틀)을 잡아 놓는 추상적인 클래스이다.
-일반 클래스는 실제 객체를 생성할 정도의 구체성을 가지는 

-반면, 추상클래스는 아직 메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없다.

 

②  추상클래스 특징


-메소드와 클래스에 abstract 예약어를 사용한다.
-추상클래스는 new(인스턴스화) 할 수 없다.(객체생성 불가)
-추상메소드가 없어도 abstract 키워드를 사용하면 추상클래스가 된다
-생성자를 가질 수 있고, 일반 메소드도 가질 수 있다.
-생성자를 갖지만, 객체 생성이 불가능하다. 그런데 구현된 자식클래스의 객체는 받을 수 있다.(다형성에서 자주 쓰임)
-추상클래스의 변수를 초기화 할 수 있다.(자동 초기화도 된다.)
-공통적으로 사용할 수 있는 필드와 메서드를 공통적으로 추출해 만들어진 클래스이다.
-구현해야하는 메소드들은 상위 클래스에서 선언을 해놓고,구현의 책임을 하위클래스에 위임한다.
-하나의 추상메소드라도 포함을 하면 추상 클래스가 되야 한다.
-모든 메소드가 구현되있다고 해도 클래스에 abstract 키워드를 사용하면 추상 클래스가 된다.
-자기 자신의 객체를 생성하지 못하는 거 외에는 일반클래스와 비슷하다.
-인터페이스와의 차이점은 멤버 변수를 갖고 있느냐 없느냐의 차이.(추상클래스는 가질 수 있고 인터페이스는 안됨)

-또 다른 차이점은 인터페이스는 구현 여부가 필수 이지만 추상클래스는 그렇지 않다

 

인터페이스

① 인터페이스란?

 

클래스가 사용되는 방식 / 접점만을 선언하는 클래스와 유사한 틀

클래스 사용의 권고사항을 제시하는 역할을 하는 특수형태의 클래스
아무런 구현이 되어 있지 않으며, 모든 메소드가 추상 메소드 이다

be able to ~ , ~할수있는에 해당하는 기능을 부여하며 ~able로 네이밍하는경우가 많다.

 

②  인터페이스 특징

 

-class 가 아니고 interace 키워드를 사용한다
- 파일도 class가 아닌 interface로 생성 가능 하다
- public과 default 접근제어자 사용가능하다
- 멤버 변수는 항상 "public static final"이다.
- 인터페이에는 클래스 멤버 변수밖에 생성하지 못한다
- 객체를 생성하지 않기 때문에 생성자도 없다

- 멤버 메소드는 항상 "public abstract"이다.

- 정적 메소드도 선언이 가능하다(static) 

-하지만 정적 메소드는 구현부가 있어야 한다

-인터페이스의 상속은 implements 키워드를 사용한다.

-클래스는 하나만 상속할 수 있으나, 인터페이스는 여러개를 구현 가능하다


SRP 단일책임 원칙


단일 책임 원칙 - SRP (Single Responsibility Principle)
단일 책임 원칙(SRP)는 객체는 단 하나의 책임만 가져야 한다는 원칙을 말한다.
여기서 '책임' 이라는 의미는 하나의 '기능 담당'으로 보면 된다.
즉, 하나의 클래스는 하나의 기능 담당하여 하나의 책임을 수행하는데 집중되어야 있어야 한다는 의미이다.
 
실생활의 물체로 SRP 원칙을 이해하려고 해보면, 아래 그림과 같이 가위, 커터칼, 드라이버를 따로따로 사용하느냐, 하나의 다용도 공구로 합쳐 다재다능하게 사용하느냐에 따른 차이로 볼 수 있다.
어찌보면 다용도 공구가 공간의 절약도 있을테고 사용하기 좋을것 같지만, 사용이 아닌 코드를 설계하는 입장에서는 이는 단일 책임 원칙을 위반하는 모습이 되어 마이너스 적인 요소로 작용된다.

유지보수와 밀접한 관련 / 기능 변경(수정)' 이 일어났을때의 파급 효과 
한 객체에 책임이 많아질수록 클래스 내부에서 서로 다른 역할을 수행하는 코드끼리 강하게 결합될 가능성이 높아지게 되어 시스템이 복잡 / 모듈이 변경되는 이유가 한가지 여야 함

한 책임의 변경으로부터 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있게 된다.
뿐만 아니라 책임을 적절히 분배함으로써 코드의 가독성 향상, 유지보수 용이라는 이점까지 누릴 수 있으며, 뒤에서 배울 다른 설계 원리들을 적용하는 기초

 

개방 폐쇄 원칙 - OCP (Open Closed Principle)

개방 폐쇄의 원칙(OCP)이란 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다는 원칙을 말한다.
보통 OCP를 확장에 대해서는 개방적(open)이고, 수정에 대해서는 폐쇄적(closed)이어야 한다는 의미로 정의한다.
여기서 확장이란 새로운 기능이 추가됨을 의미한다.
따라서 해석하자면, 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법을 말한다고 보면 된다.

[ 확장에 열려있다 ] - 모듈의 확장성을 보장하는 것을 의미한다. - 새로운 변경 사항이 발생했을 때 유연하게 코드를 추가함으로써 애플리케이션의 기능을 큰 힘을 들이지 않고 확장할 수 있다.[ 변경에 닫혀있다 ] - 객체를 직접적으로 수정하는건 제한해야 한다는 것을 의미한다.- 새로운 변경 사항이 발생했을 때 객체를 직접적으로 수정해야 한다면 새로운 변경사항에 대해 유연하게 대응할 수 없는 애플리케이션이라고 말한다.- 이는 유지보수의 비용 증가로 이어지는 매우 안좋은 예시이다.- 따라서 객체를 직접 수정하지 않고도 변경사항을 적용할 수 있도록 설계해야 한다. 그래서 변경에 닫혀있다고 표현한 것이다.

 

코드의 팁!

자바는 public class일 경우 반드시 파일명과 클래스명이 동일 해야한다
static private는 자기 자신만 되서 상속받은 친구도 못쓴다
영어가 자간이 넓게 써찔때 Alt + =(IME 변경) or Win + 스페이스바(입력기 전환)]

제네릭은 타입은 그 자체로 연산 안된다. 형을 바꿔줄 필요가 있음

 

Best Tip

자바의 다양한 클래스는 어떻게 만드는지 어떤 내용인지도 중요하지만 

제일 중요한 것은 언제 사용하는지다!!!!!!!

 

오늘의 회고

오늘 음.. 뭔가 개인과제하는데 너무 막혀서 생각보다. 많은 것을 하지 못했다.

 

특히 Generic 타입 관련 부분할 때 결국 구조상의 문제인걸 찾아서

코드 전반적으로 갈아바꿨지만 아직 해결하지 못했다.

이부분에서 단일책임의 원칙과 코드의 구조에 대한 설계의 중요성을 느꼈다.

안정적인 구조 설계(바꾸기 쉬움, 오류 찾기 쉬움) 기능적인 세분화(클래스마다 기능을 나누어 만들기 / 1클래스 1기능)

 

특히나 크게 느꼈던 것은 이론적인 내용과 실제 적용은 다른 부분이라는 점이다.

자바는 다양한 클래스가 존재하기 때문에 각자 자신의 장담점을 가지고 있고,

그 장점을 활용할 수 있는 부분에 사용되어야 한다고 생각한다.

언제 사용해야 하냐 그걸 아는게 젤 중요하다

 

그리고 그런걸 알기 위해서 자바 구조 원칙들에 대해서 공부를 좀 더하자

'내일배움캠프' 카테고리의 다른 글

10일  (1) 2024.04.26
9일차  (0) 2024.04.25
TIL 6일차  (0) 2024.04.22
5일차  (0) 2024.04.22
4일차  (0) 2024.04.18