▶ 하루
=> 공부 관련
1) 스프링 개구리책 CH5까지 읽고 정리
2) MVC 객체지향 리팩토링 후 피드백
3) 기술 질문 답변 못한 부분 노션에 정리
=> 파이널 프로젝트 관련
1) DB ERD 그려놓기 & 스프레드시트 정리
2) git 협업
▶ 문제 정리
1. 상수의 중복과 범람으로 난해한 코드
해결 > enum 클래스 3개를 작성하여 해결
package Enum;
public enum PrintGameResult {
WIN_RESULT("님이 이겼습니다."),
DRAW_RESULT("비겼습니다."),
LOSE_RESULT("컴퓨터가 이겼습니다.");
private final String printGameResult;
PrintGameResult(String printGameResult) {
this.printGameResult = printGameResult;
}
public String getPrintGameResult() {
return printGameResult;
}
}
=> 3개중 하나인 클래스. 반환 시 String 타입이 아닌 enum 타입 그 자체를 반환하도록 노력해보자
2. 모델의 책임 분리
> 사용자, 컴퓨터, 카운트, 게임 모델의 책임을 분리하여 작성
▶ 개인 공부
2장 자바와 절차적,구조적 프로그래밍
- 자바 실행 과정
- 사용자가 .java file에 소스코드 작성
- JDK(Java Development Kit)안에 javac.exe 컴파일러를 이용하여 .java file(Object file)을 생성
- JRE(Java Runtime Environment)안에 java.exe 프로그램 실행기를 이용하여 JVM위에서 실행
- JRE는 프로그램 안에 main() 메서드가 존재하는지 확인함, java.lang 패키지를 Static영역에 Load, Class를 Static영역에 Load
- Stack영역에 main()메소드를 적재, main()메소드 스택프레임 안에 파라미터 변수인 args스택생성
- 자바 T메모리 영역
- Static : 클래스 영역
- Stack : 메소드 영역
- Heap : 객체 영역
- 메소드 블랙박스화 : parameter, return에 의해서만 메소드 사이에 값이 전달될 뿐 서로 내부의 지역 변수를 볼 수 없다는 것을 의미
- 멀티 스레드(Multi Thread) : T메모리 영역의 Stack영역을 스레드 개수만큼 분할해서 쓰는 것
- Stack영역만 나누는 것이기 떄문에 Static, Heap영역을 공유하기 떄문에 멀티 프로세스 대비 메모리를 적게 사용
- 전역변수 문제점 : 스레드 A, 스레드 B가 전역변수를 각자 set하는 부분에서 값이 꼬일 수 있음
- 멀티 프로세스(Multi Process) : 다수의 T메모리 영역을 가지는 구조
- 각 프로세스는 각자의 T메모리를 가지고 각 고유의 공간이므로 서로 참조할 수 없음
- 멀티 스레드에 비해 높은 안정성을 보장, 하지만 많은 메모리를 사용
3장 자바와 객체 지향
- 클래스 : 분류에 대한 "개념"
- 객체 : 세상에 존재하는 유일무이한 사물
- 클래스는 "분류"의 이름으로, 객체는 "유일무이한 사물"의 이름으로 작명해야 함
- 조류의 나이는? 조류의 크기는? --> 조류는 "분류"의 개념이기 떄문에 해당질의에 답을 할 수 없으므로 클래스이다.
- bird의 나이는? bird의 크기는? --> 같은 이유로 답을 할 수 없으므로 "분류"", 클래스이다.
- 펭귄의 나이는? 펭귄의 크기는? --> 펭귄은 "분류"의 개념이기 떄문에 해당질의에 답을 할 수 없으므로 클래스이다.
- 뽀로로의 나이는? 뽀로로의 크기는? --> 뽀로로라는 유일무이한 사물의 특징이므로, 대답이 가능함
- ex) 조류 bird = new 조류(); < 인스턴스명을 잘 못 작성한 예시 >
- 클래스는 "분류"의 이름으로, 객체는 "유일무이한 사물"의 이름으로 작명해야 함
- 객체지향의 4대 특성
- 캡슐화 : 접근 제어자 priate, [default], protected, public을 통한 접근 제한
- private : 본인만 접근가능
- [default] : 같은 패키지 내의 클래스에서 접근 가능
- protected : 상속/같은 패키지내의 클래스에서 접근 가능
- public : 모두가 접근 가능
- 상속을 받지 않았다면 객체 맴버는 객체를 생성한 후 객체 참조 변수를 이용해 접근해야 한다.
- 정적 멤버는 클래스명.정적멤버 형식으로 접근하는 것을 권장함ex) 비권장 객체명.정적멤버) 이원기.인구
- ex) 권장 클래스명.정적멤버) 사람.인구
- 상속 : 부모 - 자식 관계보다는, 동물 - 포유류와 같은 구체화, 분류도와 같이 부모의 "확장"의 개념
- 상속은 상위 클래스의 특성을 "재사용"하는 것
- 상속은 상위 클래스의 특성을 "확장"하는 것
- 상속은 is a kind of의 관계를 만족해야 함
- 하위 클래스는 상위 클래스다. ( ex) 포유류는 동물이다. )
- 자바는 어째서 다중 상속을 지원하지 않는가? : 두개 이상의 상위 클래스를 상속받은 하위 클래스의 특징 중 상위 클래스의 공통 행위(메소드)가 존재할 떄 하위 클래스는 어떠한 것을 따라야 하는가? 하는 논리적 문제가 발생. 다중 상속으로 인한 득보다 실이 크다고 판단하여 Java에서는 다중상속을 지원하지 않는다.
- 인터페이스 란?
- Java는 다중상속을 지원하지 않지만, 인터페이스를 이용하여 다중상속의 효과를 볼 수 있음
- 구현 클래스 is able to 인터페이스의 개념 ( 구현 클래스는 인터페이스 "할 수 있다." )
- 인터페이스는 구현 클래스의 할 수 있는 것의 이름을 "정의"한 것이므로, 작명을 "~할 수 있는"으로 작명하는 것이 좋음
- 상속과 T 메모리
- 하위 클래스의 인스턴스가 생성될 때 상위 클래스의 인스턴스도 함께 생성된다.ex) Animal pingu = new Penguin();
- ex) Penguin pororo = new Penguin();
- 추상화 : 구체적인 것을 분해해서 관심 영역(어플리케이션 경계)에 있는 특성만 가지고 재조합 하는 것
- 구체적인 Class에는 굉장히 많은 특징과, 행위가 존재하지만, 내가 만들고자하는 영역에서 보면 특징, 행위가 매우 제한적으로 설계가능함
- 사용하고자 하는 특징, 행위를 추출하는 것을 "모델링"이라고 함
- ex) 사람이라는 구체적 Class는 시력/몸무게/혈액형/키/나이/직업/먹는행위/일하는행위/운동하는행위 등 매우 많은 특징과 행위를 가지지만, 내가 만들고자하는 "은행"어플리케이션에서의 사람은 "고객"으로 한정되며, 나이/직업/일하는행위정도로만 특징과 행위를 추출할 수 있다.
- 추상화와 T메모리
- ex) Mouse는 이름/나이/신장/체중/종/꼬리갯수/먹는행위/자는행위/무는행위/달리는행위 등 많은 특징/행위를 가지지만 내가 구현할려는 목적의 특징은 이름/나이/꼬리갯수/노래부르는행위 만 필요하면 아래와같이 정의할 수 있음
- 다형성 : 오버라이딩 / 오버로딩
- 오버라이딩(OverRiding) : 같은 메소드 이름/같은 인자 목록/상위 클래스의 메소드 "재정의"
- 오버로딩(OverLoading) : 같은 메소드 이름/다른 인자목록/다수의 메소드를 "중복 정의"
- 다형성과 T메모리ex) Animal pingu = new Penguin();
- ex) Penguin pororo = new Penguin();
- 캡슐화 : 접근 제어자 priate, [default], protected, public을 통한 접근 제한
- 혼용하여 사용하는 개념
- 클래스 맴버 = 정적 맴버 = 스태틱 멤버
- 객체 멤버 = 오브젝트 멤버 = 인스턴스 멤버
- 필드 = 속성 = 프로퍼티
- 함수 = 메서드
- 변수 공간 = 메모리 공간
4장 자바가 확장한 객체 지향
- abstract class : 추상클래스로, 추상메소드를 생성 가능, 추상클래스는 인스턴스를 생성할 수 없다.
- 추상메소드 : 메소드 선언은 있지만, 몸체는 없는 메소드
- 추상메소드는 상속한 하위Class가 OverRiding하지 않으면 컴파일 시점에 에러가 발생함
- 생성자(객체 생성자 메소드)
- 개발자가 아무런 생성자를 만들지 않으면, 자바에서는 기본생성자(파라미터 없는)를 만들어 지원함
- 인자가 있는 생성자를 하나라도 만든다면, 기본 생성자를 만들어 주지 않는다.
- static block
- 클래스가 로딩되고 클래스 변수가 준비된 후 자동으로 실행되는 블록, 주로 클래스 변수를 초기화시키는 코드를 둔다.
- 한 클래스 안에 여러 개의 static 블록을 넣을 수 있다.
- 예제
}실행 결과static String name = "홍길동"; // 변수 선언에 값을 초기화시키는 문장을 포함할 수 있다. static { System.out.println("static...1"); name = "임꺽정"; }
- 객체멤버는 클래스가 static영역에 자리 잡은 후, 객체 생성자를 통해 힙에 생성됨
- 클래스의 static불록이 실행되고 있을 때는 해당 클래스의 객체는 하나도 존재하지 않기 때문에 static블록에서는 객체 맴버 접근 할 수 없음
}실행 결과static String name = "홍길동"; // 변수 선언에 값을 초기화시키는 문장을 포함할 수 있다. static { System.out.println("static...1"); name = "임꺽정"; } static { System.out.println("static...2"); name = "유관순"; }
- main 메서드 시작! static...1 static...2 하하하`
- public static void main(String[] args) { System.out.println("main 메서드 시작!"); Student.name = "하하하"; System.out.println(Student.name); }
- `static class Student {
- 클래스 정보는 해당 클래스가 코드에서 맨 처음 사용될 때 T메모리의 static영역에 로딩되며, 이때 **단 한번 ** 해당 클래스의 static불록이 실행됨
- 클래스가 제일 처음 사용될 떄는 다음 세가지중 하나임
- 클래스의 정적 속성을 사용할 때
- 클래스의 정적 메서드를 사용할 때
- 클래스의 인스턴스를 최초로 만들 때
- main 메서드 시작!`
- public static void main(String[] args) { System.out.println("main 메서드 시작!"); }
- `static class Student {
- instanceof 연산자
- 만들어진 객체가 특정 클래스의 인스턴스인지 확인하는 연산자로 true, false를 반환함if(이원기 instanceof 사람) --> true
- ex) 사람 이원기 = new 사람()
- interface
- interface는 정적 상수(static final)와 추상메소드(public abstract)만 가능함
- 따로 명시하지 않아도, 정정 상수/추상메소드로 처리하여줌
- this 키워드
- 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역변수가 우선함
- 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용함
- 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 사용함
1. 함수형 프로그래밍이란?
⇒ 선언형 프로그래밍 : 어떻게 할 것인지 보다 무엇을 할 것인지 설명
⇒ 함수형 프로그래밍 : 순수 함수를 조합하여 소프트웨어를 만드는 방식 & 부수 효과가 없는 순수 함수를 1급 객체로 간주하여 매개변수로 넘기거나 반환값으로 사용하며 참조 투명성을 지킬 수 있다.
- 순수 함수란?부수효과란
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정함
- 객체의 필드값을 설정
- 예외나 오류가 발생하여 실행 중단
- 콘솔 또는 파일 I/O가 발생함
- ⇒ 부수 효과를 제거한 함수
- 일급 객체란?
⇒ 변수나 데이터 구조 안에 담을 수 있다
⇒ 파라미터로 전달 가능
⇒ 반환 값으로 사용 가능하다
⇒ 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다
참조 투명성이란
- 동일한 인자에 대해 동일한 결과 반환
- 이를 통해 기존의 값은 변경되지 않고 유지된다
⇒ 함수는 일급객체!
2. 자바에서는 함수형 프로그래밍을 어떻게 구현할까?
- Functional Interface
⇒ 1개의 추상 메소드를 갖고 있는 인터페이스
⇒ 함수형 인터페이스를 사용하는 이유는 자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문
- Runnable
- Supplier
- Consumer
- Function<T, R>
- Predicate
3. 람다란?
⇒ 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것 이름이 없고 파라미터 리스트, 바디, 반환 형식, 발생 가능 예외 리스트를 가짐
- 람다의 장단점
- 람다는 함수, 메서드 인수로 전달하거나 변수로 저장 가능
- 간결성 → 익명클래스처럼 많은 코드를 구현할 필요 없음
- 다중 CPU를 활용하는 형태로 구현되어 병렬 처리에 유리함
- 불필요한 루프문의 삭제 가능하며, 함수의 재활용이 용이함
- 개발자의 의도가 명확해져 가독성이 향상
- 단순히 모든 원소를 순회 시 람다식이 좀 더 느릴 수 있음
- 디버깅 시 함수 콜 스택 추적이 다소 어려움
- 지나치게 남발 시 코드가 어렵고 지저분해짐
- 무명함수는 재사용이 불가능함
- 장점
4. 스트림이란?
- 데이터의 흐름 일반적으로 데이터, 패킹, 비트 등의 일련의 연속성을 갖는 흐름을 의미
5. 직렬화란?
- 객체를 바이트 스트림으로 바꾸는 것, 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것
- 주된 목적 : 객체를 상태 그대로 저장하고 필요할 때 다시 생성해서 사용하는 것
6. OSI 7계층
- TCP와 UDP는 어디 계층?
- Http 프로토콜은 어떤걸 사용하고 있나?
- 버전별 차이
- ⇒ 7계층, 비연결성 프로토콜
- Http 프로토콜은 어떤걸 사용하고 있나?
- ⇒ 4계층
URI (Uniform Resource Identifier)
- 인터넷 자원을 나타내는 고유 식별자
- 유일함
URL (Uniformed Resource Locator)
- 프로토콜 포함
- 해당 자원의 path 의미
- 일반적으로 사이트 도메인을 자주 의미하는 편
- 웹 뿐만 아니라 컴퓨터 내트워크 상의 자원을 모두 나타낼 수 있다
URN (Uniformed Resource Name)
- 프로토콜을 포함하지 않음
- 해당 자원의 이름을 의미함
- 독립적인 자원 지시자
- page 이후 부분까지 포함
1. URI 는 네트워크 상 자원을 가리키는 일종의 고유 식별자(ID) 이다.
2. URL, URN 은 URI 에 포함되는 개념이며 URL 은 자원의 위치, URN 은 자원의 이름 을 의미한다.
▶ 수업 내용
Spring IOC
- IOC (Inversion Of Controll) : 제어의 역행
- Container 기능을 제공하여 객체간의 결합도를 떨어뜨릴 수 있음
결합도
- 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지
- ⇒ 한 객체 안에서 다른 객체의 메서드를 호출하거나 멤버 변수에 접근할 때 두 객체가 연결되어 있다는 것
- ⇒ 결합도가 높으면 유지보수에 좋지 않다. (결합된 클래스도 변경해줘야 하기 때문)
⇒ 결합도를 떨어뜨리는 것이 관건!
- 다형성을 이용 → 인터페이스 이용
- Container를 이용 → 팩토리 디자인 패턴
Container
- 객체의 생성, 운용, 소멸 등의 객체의 라이프사이클 관리를 담당함
- IoC : Container 기능이 됨
IoC 구현 방법
- Dependency Lookup
- Dependency Injection
Factory Pattern
- GOF의 디자인 패턴 중 하나
- 서로 다른 객체를 공통의 인터페이스를 이용해 생성함으로 그 객체를 이용하는 코드에서 생성 객체에 직접 결합되지 않게 하려는 것
클래스와의 결합을 없애는 법
- 객체를 누가 생성해준다면 생성 결합이 줄어드며 결합을 없앨 수 있다
- 객체를 대신 생성해서 넘겨주는 역할
- 실제 어느 객체가 생성되는지 신경 쓰지 않고 모두 동일 타입으로 이용 가능
- 인터페이스 이용 → 타입은 같지만 다른 객체임 ㅇㅇ
- 의미 있는 값은 상수화
- 클래스의 작성 규칙 제공 (추상 메서드 오버라이드)
- 인터페이스로 참조변수 생성 후 모든 구현 클래스의 인스턴스 저장 가능
- ⇒ 부모 참조변수(인터페이스)로 메서드 호출 시 자식 인스턴스의 오버라이드 메서드 호출
- ⇒ 오버라이드에 의한 다형성 - 객체간의 결합도 감소!
- Impl : 인터페이스를 상속받은 클래스
- Factory Class
Spring Container
- Container 객체 또는 Factory 객체
- Spring Framework의 초기화를 담당함
- ⇒ 개발자가 아닌 Spring Container가 객체 관리 - Spring IoC
- ⇒ Spring Bean Configuration File(XML)를 이용하여 객체의 생명주기 관리
- Spring Container는 패키지가 포함된 클래스를 제공받아 객체를 생성하여 관리
- ⇒ Spring Container에 의해 관리되는 객체 : Spring Bean
- ⇒ Spring Container는 리플렉션 기능을 이용하여 객체 생성 (class.forname()으로 classLoader에 의해 메모리에 동적 로딩하여 생성자를 이용해서 객체 생성 → 내부적으로 처리)
- 객체 생성시 기존 Spring bean을 제공받아 의존관계 설정 가능 (Property 엘리먼트 이용)
- Spring Container 기능을 제공하기 위한 객체
- Bean Configuration File(XML)의 bean 엘리먼트에 등록된 모든 클래스를 미리 객체로 생성하여 갖고 있다
- ⇒ Spring Bean Configuration File(XML)을 제공받아 Spring Bean을 생성하여 관리
- ⇒ 스프링 빈 객체가 만들어지고 컨테이너도 만들어지는 것임
- ApplicationContext.getBean(String beanName) : Spring Bean을 구분하는 식별자(beanName) 을 전달받아 Spring Container로부터 Spring Bean을 검색하여 반환하는 메서드
- ⇒ Object 타입으로 Spring Bean을 반환하므로 명시적 객체 형변환하여 사용
- ⇒ 전달받은 beanName의 Spring Bean이 없는 경우 NoSuchBeanDefinitionException 발생
- ApplicationContext 객체를 제거하는 메서드
- ⇒ Spring Container가 관리하는 모든 Spring Bean 제거
- Spring Container 기능을 제공하기 위한 객체
- ⇒ Bean Configuration File의 bean 엘리먼트에 등록된 클래스를 미리 객체로 생성하지 않고 getBean() 메서드 호출시 생성
- ApplicationContext.getBean(String beanName, Class<T> clazz) : Spring Bean을 구분하는 식별자 (beanName)와 메모리의 저장된 클래스(Clazz)를 전달받아 Spring Container 로부터 Spring Bean을 객체 형변환하여 반환하는 메서드
- Spring Container로 객체를 생성하여 제공받아 사용
IoC 컨테이너
- Spring Container : 객체를 생성하는 순간, XML 설정파일에 등록된 Bean객체들이 초기화 됨
Spring Container로부터 Spring Bean을 제공받아 사용하는 방법
⇒ Bean Configuration File(XML)을 이용하여 bean 엘리먼트를 이용하여 클래스를 Spring Bean으로 등록
Bean
- Spring Container에게 Spring Bean 관련 정보를 제공하는 엘리먼트
- ⇒ Spring Bean : Spring Container에 의해 관리되는 클래스(객체)
- class 속성 : Spring Bean으로 등록될 클래스를 속성값으로 설정 - 필수 속성
- ⇒ class 속성값은 이클립스의 자동 완성 기능을 사용하여 작성하는 것을 권장
- id 속성 : Spring Bean을 구분하기 위한 식별자(beanId & beanName)를 속성값으로 설정
- ⇒ id 속성 대신 name 속성을 사용하여 식별자 설정 가능
- ⇒ id 속성값은 클래스명 이름(부모 인터페이스 이름)을 이용하여 설정하는 것을 권장
- ⇒ id 속성값은 class 속성이 설정된 경우 클래스 이름을 이용하여 자동 완성 기능을 사용하여 작성
- init-method 속성 : Spring Bean 객체 생성 후 한번만 호출되어 초기화 작업을 실행하기 위한 메서드 이름을 속성값으로 설정 - 자동 완성 기능 사용 가능
- destroy-method 속성 : Spring Bean 객체 소멸 전 한번만 호출되어 마무리 작업을 실행하기 위한 메서드 이름을 속성값으로 설정 - 자동 완성 기능 사용 가능
- lazy-init 속성 : false & true를 속성값으로 설정
- ⇒ false(기본) : Spring Container를 초기화할 때Spring Bean 객체를 미리 생성
- ⇒ true : Spring Bean 객체를 제공받을 때 생성 (getBean() 호출해야 실행됨)
싱글톤 클래스
- 싱글톤 클래스 : 프로그램에 객체를 하나만 제공하기 위해 작성된 클래스
- ⇒ Spring Container는 리플렉션 기능을 이용하여 객체 생성함
- =⇒ 생성자가 은닉화 되어 있어도 리플렉션 기능에 의해 생성자 사용 가능
- 리플렉션 기능에 의해 클래스가 저장된 후 정적영역의 명령이 실행되어 객체 생성 ⇒ 정적영역에서 생성된 객체와 Spring Container에 의해 생성된 객체가 존재 → 객체가 2개만들어짐!!
- factory-method 속성 : 싱글톤 클래스에서 객체를 반환하는 메서드 이름으로 속성 값 설정
- ⇒ Spring Container에 의해 객체를 생성하지 않고 정적영역에서 생성된 객체를 제공받아 Spring Bean으로 사용 가능
Depends-on
- Spring Container는 bean 엘리먼트 선언 순서대로 등록된 클래스를 Spring Bean 객체로 만든다
- depends-on 속성 : bean 엘리먼트를 구분하는 식별자를 속성값으로 설정
- ⇒ 속성값으로 설정된 bean 엘리먼트의 클래스를 먼저 Spring Bean 객체로 생성
import
- 다른 Bean Configuration File의 Spring Bean 정보를 제공받아 포함하는 엘리먼트
- resource 속성 : Bean Configuration File의 경로를 속성값으로 설정
Bean 객체의 Scope
Scope 속성
- Spring Bean 객체의 생성 갯수(singleton : 기본 또는 prototype) 또는 사용범위(request 또는 session) 중 하나를 속성값으로 설정
- bean 엘리먼트에 등록된 클래스로 Spring Bean 객체를 하나만 생성하여 제공
- bean 엘리먼트에 등록된 클래스로 Spring Bean 객체를 여러개 생성하여 제공
- ⇒ lazy-init 속성값을 반드시 true로 설정하여 제공
- scope 속성값으로 singleton으로 설정한 경우
다음주는 DI (Dependency Injection)
▶ 파이널 프로젝트
> 동일한 컬럼들을 가지는 테이블을 합치기
> 구체화된 컬럼 추가
> 추상화된 선택지들은 따로 테이블을 관리
> git 이클립스 협업 프로젝트 생성 후 커밋
'레거시' 카테고리의 다른 글
2022.03.08~03.10 의 기록 (0) | 2022.03.09 |
---|---|
2022.03.07 의 기록 (0) | 2022.03.07 |
2022.03.03 의 기록 (0) | 2022.03.03 |
2022.02.28의 기록 (0) | 2022.02.28 |
2022.02.27의 기록 (0) | 2022.02.27 |