day4 🌕

장미·2022년 6월 17일
0

오늘의 성과

목록 보기
4/129

- 동건이가 리뷰해준 대로 계산기 코드 다시 짜보기


- 접근제한자 / 생성자 / SOLID 알아보기

접근 제한자: 클래스 및 인터페이스, 멤버의 접근을 제한한다.

  • public: 모든 접근 허용
  • protected: 같은 패키지에 있는 객체와 상속 관계의 객체만 접근 허용
  • default: 같은 패키지에 있는 객체만 접근 허용
  • private: 현재 객체 내에서만 접근 허용 (해당 클래스에서만 접근 가능)

접근 제한자 사용

  • 클래스: public, default
  • 생성자: public, protected, default, private
  • 멤버 변수: public, protected, default, private
  • 멤버 메소드: public, protected, default, private
  • 지역 변수: 접근 제한자 사용 불허

*캡슐화: 정보 은닉. 관련이 있는 데이터, 동작들을 하나로 묶어 요약하고 사용자에게는 내부적인 접근을 허용하지 않는 대신 편의성을 제공해 준다.
→ 데이터 보호, 유지보수, 사용자 편의성 면에서 장점을 가진다.


생성자(Constructor)
메서드명이 클래스명과 동일하고, 리턴 자료형을 정의하지 않는 메서드.
→ 객체 변수에 값을 무조건 설정해야만 객체를 생성함.

생성자의 규칙

  1. 클래스명과 메서드명이 동일해야 한다.
  2. 리턴 타입이 없어야 한다. (void도 no!!)

✔️ 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어 준다.
*기본 생성자: 생성자의 입력 항목이 없고 생성자 내부에 아무 내용이 없는 생성자.

package constructor01;

public class Animal {
	
}
예제1
package constructor01;

public class Animal {
	public Animal() {}
}
예제2

예제 1처럼 만들어도 컴파일 과정에서 자바 컴파일러가 알아서 예제2처럼 기본 생성자를 만들어 준다.

✔️ 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.

✔️ 생성자는 객체가 생성될 때 호출된다.
new 클래스명(입력 인수, …)

public class Animal {
	public Animal(String name) {
		System.out.println(name);
	} 
}
public class Example {
	public static void main(String[] args) {
		Animal Dog = new Animal("Dog");
	} 
}

생성자 오버로딩
하나의 클래스에 여러 개의 입력 항목이 다른 생성자를 만들 수 있다. (메서드 오버로딩과 동일한 개념)

public class Animal {
	public Animal(String name) {
		...
	}
	public Animal(int type) {
		...
	}
}

SOLID: 객체 지향 설계 5원칙 → 응집도는 높이고 결합도는 낮춘다.

  • SRP(Single Responsibility Principle): 단일 책임 원칙
  • OCP(Open Closed Principle): 개방 폐쇄 원칙
  • LSP(Liskov Substitution Principle): 리스코프 치환 원칙
  • ISP(Interface Segregation Principle): 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle): 의존 역전 원칙

✔️ SRP: 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

  • 하나의 클래스는 하나의 책임만 가져야 한다.
  • 하나의 속성이 여러 의미를 갖는 경우도 단일 책임 원칙을 지키지 못하는 경우다.

✔️ OCP: 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.

  • 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만, 변경에 대해서는 닫혀 있어야 한다.
    → 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
  • 상위 클래스 또는 인터페이스를 중간에 둠으로써 영향을 받지 않을 수 있다. (예: JDBC 등)
  • 개방 폐쇄 원칙을 무시하면 객체 지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 얻을 수 없다.

✔️ LSP: 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.

  • 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.

    예: 아버지 춘향이 = new 딸() → X
    동물 뽀로로 = new 펭귄() → O

    펭귄이 동물 역할을 하는 것은 문제가 되지 않는다.


✔️ ISP: 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.

  • 각 역할에 맞게 인터페이스로 분리하는 것. (상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다.)
  • SRP와 ISP는 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다. 하지만 특별한 경우가 아니라면 SRP를 적용하는 것이 더 좋은 해결책이다.

✔️ DIP: 자신보다 변하기 쉬운 것에 의존하지 마라.

  • 하위 클래스나 구체 클래스가 아닌, 상위 클래스, 인터페이스, 추상 클래스를 통해 의존해야 한다.
  • 상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기 때문이다.
  • 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.

*응집도: 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성
응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이하다.

*결합도: 모듈(클래스) 간의 상호 의존 정도
결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어 객체의 재사용이나 수정, 유지보수가 용이하다.


- OSI 7계층 다시 개념 잡기

유튜브에 올라온 영상들을 보며 데이터 전송 과정이 어떤 식으로 흘러가는지 공부했다.
+) 22. 06. 22. 복습해서 추가함!

OSI 7계층과 TCP/IP 스택은 복잡한 네트워크를 단계별로 나누어 이해하기 쉽도록 도와준다.

  • 1~4계층: 데이터 플로 계층(Data Flow Layer) / 하위 계층(Lower Layer)
    → 데이터를 상대방에게 잘 전달하는 역할.

  • 5~7계층: 애플리케이션 계층(Application Layer) / 상위 계층(Upper Layer)
    → 데이터를 만드는 부분.

  • 1계층(피지컬)

    • 물리적 연결과 관련된 정보를 정의한다.

    • 들어온 전기 신호를 그대로 잘 전달하는 것이 목적.

    • 전기 신호가 1계층 장비에 들어오면 이 전기 신호를 재생성하여 내보낸다.

      주요 장비: 허브, 리피터, 케이블, 커넥터, 트랜시버, 탭 등
      허브, 리피터 → 네트워크 통신을 중재하는 네트워크 장비

  • 2계층(데이터 링크)
    • 전기 신호를 모아 우리가 알아볼 수 있는 데이터 형태로 처리한다.

    • 주소 정보를 정의하고 정확한 주소로 통신이 되도록 하는 데 초점이 맞추어져 있다.

    • 데이터에 대한 에러를 탐지하거나 고치는 역할을 수행할 수 있다.
      (이더넷 기반 네트워크에서는 에러를 탐지하는 역할만 수행한다.)

    • MAC 주소 체계 존재.
      스위치는 MAC 주소를 보고 통신해야 할 포트를 지정해 내보낸다.

      네트워크 인터페이스 카드(네트워크 어댑터), 스위치

  • 3계층(네트워크)
    • IP 주소와 같은 논리적인 주소가 정의된다.

    • 데이터 통신을 할 때 2계층의 물리적인 MAC 주소와 3계층의 논리적인 IP 주소가 사용된다.

      장비: 라우터
      라우터는 IP 주소를 사용해 최적의 경로를 찾아주고 해당 경로로 패킷을 전송하는 역할을 한다.

  • 4계층(트랜스포트)
    • 1~3계층은 신호와 데이터를 올바른 위치로 보내고 실제 신호를 잘 만들어 보내는 데 집중한다.

    • 4계층은 실제로 해당 데이터들이 정상적으로 잘 보내지도록 확인하는 역할을 한다.

    • 패킷이 유실되거나 순서가 바뀌었을 때 바로잡아 주는 역할을 한다.

    • 4계층에서 패킷을 분할할 때 패킷 헤더에 보내는 순서받는 순서를 적어 통신한다.
      → 패킷이 유실되면 재전송 요청 가능, 순서가 뒤바뀌어도 바로잡을 수 있음.

      보내는 순서 == 시퀀스 번호
      받는 순서 == ACK(Acknowledgement) 번호

      장비: *로드 밸런서, 방화벽
      → 애플리케이션 구분자(포트 번호)와 시퀀스, ACK 번호 정보를 이용해 부하를 분산하거나 보안 정책을 수립해 패킷을 통과, 차단하는 기능을 수행한다.

*로드 밸런서에는 동일한 서비스를 하는 다수의 서버가 등록되고 사용자로부터 서비스 요청이 오면 로드 밸런서가 받아 사용자별로 다수의 서버에 서비스 요청을 분산시켜 부하를 분산한다.

*로드 밸런서는 각 서버의 서비스 상태를 체크해 서비스가 가능한 서버로만 사용자의 요청을 분산하므로 서버에서 장애가 발생하더라도 기존 요청을 분산하여 다른 서버에서 서비스를 제공할 수 있다.

  • 5계층(세션)

    • 양 끝단의 응용 프로세스가 연결을 성립하도록 도와주고, 연결이 안정적으로 유지되도록 관리하고 작업 완료 후에는 이 연결을 끊는 역할을 한다.

    • TCP/IP 세션을 만들고 없애는 책임을 진다.

    • 에러로 중단된 통신에 대한 에러 복구와 재전송을 수행한다.

  • 6계층(프레젠테이션)
    • 표현 방식이 다른 애플리케이션이나 시스템 간의 통신을 돕기 위해 하나의 통일된 구문 형식으로 변환시킨다. (like 번역기)
      → 사용자 시스템의 응용 계층에서 데이터의 형식상 차이를 다루는 부담을 덜어준다.

      MIME 인코딩이나 암호화, 압축, 코드 변환 등

  • 7계층(애플리케이션)
    • 애플리케이션 프로세스를 정의하고 애플리케이션 서비스를 수행한다.

    • 네트워크 소프트웨어의 UI 부분이나 사용자 입, 출력 부분을 정의한다.

      프로토콜: FTP, SMTP, HTTP, TELNET 등


- 오늘의 토픽 공부하기 (IOC, DI, AOP)

책이랑 구글링으로 개념 찾아봄! 노션으로 정리는 계속 하는 중.


- 운영체제 1챕터 마저 읽기

  • PART 01. 운영체제와 컴퓨터

    • CHAPTER 01. 운영체제의 개요

      • 커널: 프로세스 관리, 메모리 관리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 모아놓은 것. (like 자동차 엔진 → 운영체제의 성능은 커널이 좌우한다.)

      • 인터페이스: 커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할.

      • 시스템 호출: 커널이 자신을 보호하기 위해 만든 인터페이스.
        → 자원을 이용하려면 시스템 호출이라는 인터페이스를 이용하여 접근해야 한다.

      • 커널이 하는 일
        핵심 기능설명
        프로세스 관리프로세스에 CPU를 배분하고 작업에 필요한 제반 환경 제공
        메모리 관리프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상공간 제공
        파일 시스템 관리데이터를 저장하고 접근할 수 있는 인터페이스 제공
        입출력 관리필요한 입력과 출력 서비스 제공
        프로세스 간 통신 관리공동 작업을 위한 각 프로세스 간 통신 환경 지원

      • 단일형 구조 커널: 커널의 핵심 기능을 구현하는 모듈들이 구분 없이 하나로 구성되어 있다. (예: MS-DOS, VMS, 초기 유닉스 운영체제)

      • 계층형 구조 커널: 비슷한 기능을 가진 모듈을 묶어서 하나의 계층으로 만들고 계층 간의 통신을 통해 운영체제를 구현한다.

      • 마이크로 구조 커널: 운영체제가 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 제공한다.

profile
김뉴비

0개의 댓글

관련 채용 정보