본문 바로가기
레거시

2022.02.15의 기록

by GroovyArea 2022. 2. 15.

▶ 오늘 실현 가능한 세부 목표

 

=>  공부 관련

1) 배운 내용 복습 o

2) 인터페이스에서 메소드를 구현하려면 어떻게 해야 하는지 o

3) SOLID 5원칙 제대로 알기 o

4) 컬렉션 프레임워크란? 요약 설명 o

5) 자바의 정석 객체지향 프로그래밍 2 o

6) 순수 자바로 MVC 패턴 구현을 어떻게 해야 하는지 o

 

=>  파이널 프로젝트 관련

1) 파이널 사이트 알아보기 (구체적인 것 강사님께 질문)

2) 구글 크롬 디버깅 공부

 

 수업 공부 관련

> JSON 객체에서 배열로 받아올 때 엔터키나 따옴표가 들어가면 에러가 난다. (자바스크립트 객체로 표현할 수 있는 문자들 parse()가 자스 객체로 바꾸지 못함)

 

> 입력 받은 그대로 출력하는게 정석이다. (다른 태그로 바꿔 출력하면 문제가 발생함)

 

> jQuery append : 자식으로 생성해서 추가, appendTo : 자식으로 이동 반대인 prepend가 있음

 

> xml 데이터들을 스프링이 알아서 만들어줌 만들어지는 설정만 해주면 됨

 

> SI는 절대 가지마라 구글링할 때 코드는 제대로 알고 가져오자 - 오강사님 - 

> 디자인 패턴이 다양하게 적용된 것도 파악할 수 있어야한다. 

> 댓글은 스프링에서 페이징 처리까지 구현할 예정

 

> RSS 서비스 : (Really Simple Syndication 또는 Rich Site Summary) : 실시간으로 변경되는 정보를 제공하기 위한 서비스 ex) 뉴스 같은 것

> ajax 기능은 현재 서버에 존재하는 웹프로그램을 요청하여 응답결과를 제공받아 처리만 가능 => 다른 서버에 

존재하는 웹프로그램을 요청한 경우 에러 발생 -  에러코드 : 0

> proxy server : 중계자 역할을 하는 서버 (데이터를 대신 요청해서 받고 넘겨주는 역할)

 

> GetMethod : Get방식으로 웹프로그램을 요청하기 위한 클래스 (가상의 브라우저를 이용하여 웹프로그램을 요청하기 위한 인스턴스를 생성하기 위해 사용) 

> PostMethod : Post방식으로 웹프로그램을 요청하기 위한 클래스

> HttpClient.executeMethod(Method method) : 가상의 브라우저를 이용하여 웹프로그램을 요청하는 메소드

=> 요청에 대한 상태코드 반환

 

> Method.getResponseBodyAsString() : 요청에 대한 응답결과를 문자열로 변환하여 반환하는 메소드

=> 응답결과를 반환받아 원하는 문자형태(캐릭터셋)로 변환하여 저장

 

> Method.releaseConnection() : 요청 정보를 제거하는 메소드

 

 개인 공부 관련

인터페이스에서 메소드 상세 선언 가능 여부

  • 기본적인 특징
  1. 추상클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메서드와 멤버 변수를 가질 수 없다.
  2. 기능을 명시적으로 선언하는 역할로 추상 메서드와 상수로만!
  3. 구현할 코드가 없으므로 당연히 인스턴스를 생성할 수 없다.
  4. 다중 상속이 가능하며 인터페이스 간의 상속 관계는 extends 키워드 이용
  5. 클래스에서 인터페이스를 구현하려면 implements 키워드 사용
  • 타입 상속과 형 변환 - 다형성
  1. 인터페이스를 구현한 클래스는 인터페이스 타입으로 변수를 선언하여 인스턴스를 생성할 수 있다. 이를 인터페이스가 구현 코드가 없기 때문에 타입 상속이라고 한다.
  2. 클래스는 해당 인터페이스형으로 묵시적 형 변환이 이루어지는데, 형 변환 되었을 때 사용할 수 있는 메서드는 인터페이스에 선언한 메서드뿐이다.
  3. 인터페이스는 메서드의 매개변수 타입으로 사용할 수 있다. 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다.
  4. 리턴 타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
  • 인터페이스의 장점
  1. 개발 시간 단축인터페이스가 작성되면 이를 사용해서 프로그램을 작성하는 것이 가능하다.메서드를 호출하는 쪽에서는 선언부만 알면 되기 때문이다.
  2. 표준화 가능프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 하면 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
  3. 서로 관계없는 클래스들 간의 관계를 맺어준다하나의 인터페이스를 공통적으로 구현하도록 하여 관계를 맺어 줄 수 있다.
  4. 독립적인 프로그래밍이 가능인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.

⇒ 데이터베이스 관련 인터페이스를 정의하고 이를 이용해서 프로그램을 작성하면,데이터베이스의 종류가 변경되더라도 프로그램을 변경하지 않도록 할 수 있다.

  • 디폴트 메서드(default method) ⇒ 질문에 대한 답 jdk 8 이후 가능
  1. 기본 구현을 가지는 메서드. 앞에 default 예약어를 붙이며, 추상 메서드와 달리 일반 메서드처럼 몸통 {} 이 있어야 한다.
  2. 디폴트 메서드는 인터페이스에 이미 구현되어 있으므로 인터페이스를 구현한 클래스에서 코드를 구현할 필요가 없다. 단, 구현하는 클래스에서 재정의 할 수 있다.
  3. 여러 인터페이스의 디폴트 메서드 간의 충돌인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.
  4. 디폴트 메서드와 상위 클래스의 메서드 간의 충돌상위 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
  • 정적 메서드(static method) ⇒ 질문에 대한 답 jdk 8 이후 가능
  1. 인스턴스 생성과 상관없이 인터페이스 타입으로 호출하는 메서드다.
  2. static 예약어를 사용하며, 접근 제어자는 항상 public이며 생략할 수 있다.
  3. 정적 메서드를 사용할 때는 인터페이스를 직접 참조하여 사용한다.
  4. 구현 클래스에서 재정의 불가능!

객체지향 SOLID 5원칙

1. Single Responsiblity Principle (단일 책임 원칙)

  • 소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다.
  • 여기서 책임이란, '기능' 정도의 의미로 해석하면 된다.
  • 설계를 잘한 프로그램은 기본적으로 새로운 요구사항과 프로그램 변경에 영향을 받는 부분이 적다. 다시말해, 응집도는 높고 결합도는 낮은 프로그램을 뜻한다. 만약 한 클래스가 수행할 수 있는 기능, 즉 책임이 많아진다. 책임이 많아지면 클래스 내부의 함수끼리 강한 결합을 발생할 가능성이 높아진다. 이는 유지보수에 비용이 증가하게 되므로 따라서 책임을 분리시킬 필요가 있다.

2. Open-Closed Principle (개방-패쇄 원칙)

  • 기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 설계해야 한다.
  • OCP에 만족하는 설계를 할 때 변경되는 것이 무엇인지에 초점을 맞춘다. 자주 변경되는 내용은 수정하기 쉽게 설계 하고, 변경되지 않아야 하는 것은 수정되는 내용에 영향을 받지 않게 하는 것이 포인트다. 이를 위해 **자주 사용되는 문법이 인터페이스(Interface)**이다.

⇒ 위와 같은 디자인 패턴은 Strategy Pattern (전략 패턴) 프로그램

  • 결과적으로 우리는 SoundPlayer 클래스의 변경 없이 재생되는 파일을 바꿀 수 있으므로 위 코드는 OCP를 만족한다. 앞서 말했듯이 OCP를 만족한 설계는 변경에 유연하므로 유지보수 비용을 줄여주고 코드의 가독성 또한 높아지는 효과를 얻을 수 있다.

3. Liskov Substitution Principle (리스코프 치환 원칙)

  • 자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.
  • 리스코프 치환 원칙은 MIT 컴퓨터 사이언스 교수인 리스코프가 제안한 설계 원칙이다. 부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙이며, 이는 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신 자식 클래스의 인스터스를 사용해도 문제가 없어야 한다는 것을 의미한다.
  • 상속 관계에서는 일반화 관계(IS-A)가 성립해야 한다. 일반화 관계에 있다는 것은 일관성이 있다는 것이다. 따라서 리스코프 치환 원칙은 일반화 관계에 대해 묻는 것이라 할 수 있다.

4. Dependency Inversion Principle (의존 역전 원칙)

  • 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다는 원칙이다.

***** JAVA 객체 지향 디자인 패턴(정인상/채홍석 지음, 한빛미디어, 2014) p.121 인용

  • 변화하기 쉬운것이란 구체적인 것을 말하고, 변화하기 어려운 것이란 추상적인 것을 말한다. 객체지향적인 관점에서 보자면 변화하기 쉬운것이란 구체화 된 클래스를 의미하고, 변화하기 어려운 것은 추상클래스나 인터페이스를 의미한다. 따라서DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미한다.

  • setFile 클래스를 이용하여 실행하고자 하는 파일을 쉽게 바꿀 수 있다. 마찬가지로 새로운 오디오 파일 포맷(예를들면 FLAC)을 실행시키고자 한다면, 새로운 클래스(FLAC)를 만든 후 play 인터페이스를 상속받아 구현한 후 setFile 메소드를 이용하여 file 멤버 변수에 주입시키면 된다. 이와같은 기술을 '의존성 주입' 이라 한다.

5. Interface Segregation Principle (인터페이스 분리 원칙)

  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다.
  • 이는 다시 말해서, 자신이 사용하지 않는 기능(인터페이스)에는 영향을 받지 말아야 한다는 의미이다.
  • 우리는 스마트폰으로 전화, 웹서핑, 사진 촬영 등 다양한 기능을 사용할 수 있다. 그런데 전화를 할 때에는 웹서핑, 사진촬영 등 다른 기능은 사용하지 않는다. 따라서 전화기능과 웹서핑 기능 사진 촬영 기능은 각각 독립된 인터페이스로 구현하여, 서로에게 영향을 받지 않도록 설계해야 한다. 이렇게 설계된 소프트웨어는 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다.

 

객체지향 프로그래밍 2

제어자

  • final 키워드 : 이 키워드가 붙은 변수의 경우 초기화가 불가능하지만 생성자를 이용하여 초기화가 가능하다.

접근 제어자

  • 접근 제어자를 이용해 캡슐화가 가능하다. 데이터 감추기 (객체지향개념의 캡슐화)
  • 접근 제어자를 사용하는 이유
  1. 외부로부터 데이터를 보호하기 위해서
  2. 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서

제어자의 조합

  • 메서드에 static과 abstract를 함께 사용할 수 없다. ⇒ 몸통이 있는 메서드만 사용 가능
  • 클래스에 abstract와 final을 동시에 사용할 수 없다. ⇒ 모순
  • abstract메서드의 접근 제어자가 private일 수 없다. ⇒ 접근불가, 오버라이드 불가능
  • 메서드에 private과 final을 같이 사용할 필요는 없다. ⇒ 오버라이드 불가능

다형성

  • 여러 가지 형태를 가질 수 있는 능력
  • 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로 써 다형성을 프로그램적으로 구현하였다.
  • 형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것뿐이다.
  • 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.

추상클래스

  • 추상메소드를 모두 오버라이딩 하지 않을 경우 상속받은 자식 클래스 역시 추상 클래스로 지정되어야 한다.

인터페이스

  • 모든 멤버변수는 상수이며 모든 메서드는 추상메서드 키워드는 생략 가능 컴파일러가 알아서 지정해줌.
  • 상속보다는 구현이라는 뜻을 사용함.
  • 다중상속이 가능하지만 실제로 다중상속을 구현하는 경우는 거의 없다.
  • 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
  • 클래스를 사용하는 쪽과 클래스를 제공하는 쪽이있다. 메서드를 사용하는 쪽에서는 사용하려는 메서드의 선언부만 알면 된다. (내용은 몰라도 됨)

 

 

 파이널 프로젝트 관련

1. 카페 좌석 예약 시스템

2. 단체옷 주문 제작 사이트

3. 온라인 공연 예매 사이트

4. 개발자 커뮤니티 사이트

5. 학사 정보 (관리) 시스템

6. erp?

반응형

'레거시' 카테고리의 다른 글

2022.02.17의 기록  (0) 2022.02.17
2022.02.16의 기록  (0) 2022.02.16
2022.02.14 (개념 정리)  (0) 2022.02.15
2022-02-14의 기록  (0) 2022.02.14
2022-02-13의 기록  (0) 2022.02.13