1. Java + FrameWork : 230512
1) OOP
- 프로그래밍 방법론 중에 하나이다. 객체를 중심으로 둔 방법론이다.
2) Mybatis
- 데이터베이스를 이용하기 위한 Mapper 프레임워크입니다. 데이터를 저장하기 위한 라이브러리 중에 하나이다. 데이터 베이스를 이용하기 위한 프레임워크
- DAO 인터페이스와 Mapping을 연결해준다.
3) JPA
- 데이터베이스를 이용하기 위한 ORM(객체 관계형 매핑) 관련 프레임워크이다. DAO나 Repository를 대신 구현해준다.
4) 가비지 컬렉터 :
- 메모리에 할당되는 것은 Heap에 할당되는 데이터이다.
- 원래 Heap에 있는 데이터는 트리 구조이다.
- 시간이 여유 있을 때, 가비지 컬렉터가 돌아다닌다
- 언제 가비지 컬렉터가 삭제 되는지?
- 참조한 변수를 지금 막 생성한 것이 있고 나중에 생성한 것이 있다.
- 즉, 메모리가 없거나 시간이 있으면,
- 참조 변수가 적은 순서대로(방금 생성된 것) 제거된다.
- 메모리가 부족할 때, 자기가 참조하지 않은 녀석들을 제거한다.
- 항상 상황을 봐가면서 동작하게 된다.
5) 자바의 데이터 타입 :
- 기본 데이터 타입 : short, byte, int, Long, float, double, boolean, char
- Wrapper 클래스 : Integer, Long,
- 기본 데이터 타입을 물어보는 건지? : 수준이 낮은 질문
- 성질을 물어보는 건지? : Wrapper 클래스인지? Primitive 클래스인지 구분하기!
- Stack에 값형식 변수가 할당되고 Heap에 참조형 변수(클래스, 인터페이스)가 할당!
- 값 형식* : java에서 기본적으로 제공해주는 데이터 타입, 값의 형식을 구분한 형식
- 참조 형식* : 값이 아니라 값들을 담을 구조를 의미한다. 구조화된 데이터 구조를 설명.
- 값형 형식 변수* : 값만 담는 그릇
- 참조 형식 변수* : 구조를 참조할 수 있는 그릇이다.
- 참조는 주소를 저장하지 않고 참조를 저장하는 것이다. 물리적으로는 주소를 저장하지만 실제 주소는 아니다.
6) 캡슐화* :
- 캡슐은 관련 있는 속성들을 모아서 데이터 구조를 정의한다.(피상적인 교과서적인 이야기) 코드의 재사용성 가능
- 객체들이 책임을 적절히 나누어 부여하는 것(중요!!)** : 내부적인 이야기
- 책임이란? 코드를 의미한다. ‘기능’을 말하는 것 같다.**
- @Service에서 @Requset, @Response를 사용하면 안 된다. @Controller에서는 입출력만 있어야 한다.**
- 캡슐화를 하지 않으면, 구조화된 프로그래밍이 되어서 코드를 한 곳에 모아서 구현되어 책임이 없다. 가독성이 떨어짐.
7) 패턴
- 구조가 구조화된 것이다.
8) 다형성 및 동적 바인딩
a. 다형성
-
다양한 성질을 보이는 클래스나 메서드의 다양한 형태이다.
-
선생님 답** : 캡슐(=클래스)에 다양한 성질을 보이도록 하는 것이다. 전제조건은 캡슐이 부품이 갈아 끼울 수 있어야 한다. 또한, 도킹 같은 것을 의미한다. 이러한 개념은 인터페이스 개념에서 사용된다.
-
캡슐을 만들 때, 분리형으로 만들어서 부품으로 만들어서 꽂아서 사용한다.
-
쌤 답: 다양한 형태로 부품을 바꿔낄 수 있도록 하는 성질, 다양한 형태로 조립이 가능한 성질, 부품을 바꿔낄 수 있는 것은 인터페이스에서 사용한다.*
-
인터페이스에서 사용하는 방법은 3가지 방식이 있다. 오버로드 생성자 인젝션!, setter 인젝션!, field 인젝션! => 이것은 스프링의 결합인 @Autowired 기능이다. 엄청 편리해졌다.
-
스프링에서 다형성은 Mybatis의 DAO랑 JPA의 DAO를 부품으로 교체할 수 있는 개념이다. Controller vs RestController 개념이다.
b) 동적 바인딩 : 자바에서는 컴파일 동작과 런타임 동작에서 코드가 실행된다.
-
컴파일 전에 함수가 호출되는 위치가 결정되면 이것은 정적 바인딩이다.
-
런타임(함수 호출)시, 함수가 호출되는 위치가 결정되면 동적바인딩이다. 따라서, 전달되는 객체에 따라서 호출되는 함수가 달라진다!
-
static은 미리 마련된 변수라서 정적 바인딩이다.
-
dynamic은 그때 그때 함수가 호출될 때, 바뀐다. 동적 바인딩 : 동적으로 함수의 위치를 결정하기! 함수의 위치를 동적으로**
-
자바는 주소와 함수를 매핑해놓는 주소공간이 있다.
-
자바는 주소와 함수를 매핑해놓는 주소 공간이 있다.**
-
함수 동적 바인딩 : 함수가 호출될 주소가 자기가 가지고 있는 객체의 함수에 의해 결정된다.
9) 상속(has a, is a) :
a. has a 상속
- 일반적인 상속이 아니라, 조립을 의미한다.(추상클래스에서 사용하는 개념**)
- 틀이 없는 경우가 있기 때문에 이 경우에는 전부 조립을 해야 한다.
b. is a 상속
- 틀을 물려받는 것. 부모의 캡슐을 나의 틀(framework)로 사용하겠다.(implement)
- 중요! : 다른 캡슐을 나의 틀(framework)로 사용하겠다.(인터페이스에서 사용하는 개념**)
- 보통 그 틀을 고쳐쓰거나 사용한다.
- 교과서 의미 : 부모의 속성을 물려받는 것**
c. 상속을 이용하여 개발하면, 상속의 부족한 단점
-
차라리 조립할 걸(상속)의 의미
-
결합력이 높아진다.
-
다시 처음부터 만드는게 더 빠를수도..
10) 클래스 vs 인스턴스
-
클래스 : 하나의 타입이다.(메뉴판의 자장면 **) -> 클래스는 실존한는 것이 아니다…
-
인스턴스 : 실체화된 것(주문하면, 실제로. 존재하는 자장면이다.**)
11) 스레드?
-
실행 흐름을 만드는 최소 단위.**
-
프로세스도 실행 단위이기 때문이다.
-
메인 스레드는 메인 함수에 약속되어 있다.
-
메인 함수이다.
-
인터페이스 : Runnable, 실행함수 :Thread
12) Static 키워드란?
-
static 키워드는 클래스가 메모리에 올라갈 때, 미리 이미 자동적으로 생성되어 준비해놓는 것?이다. 그래서 바뀌지 않는다.
-
static 키워드를 빼면, 인스턴스 때마다 생성되어 호출되어야 한다.
-
그래서, 전역적으로 사용할 수 있다. 인스턴스를 생성하지 않아도 되어서 속도가 빠르다.
-
모든 인스턴스에 공통적으로사용할 때, 사용한다.
13) 추상클래스, 인터페이스
a. 추상 클래스 : 공통 분모
-
추상 => 추상화 : “일반화” == “공통 자료형”을 의미한다?
-
캡슐들의 집중화한 것을 “추상화”라고 한다.
-
중요!: 집중화이다. 일괄처리가 가능하다.
-
공통 분모 클래스라서 공통 분모 자료형으로도 사용할 수 있다.
b. 인터페이스 :
-
일괄처리만 가능하고 집중화는 불가능하다.
-
분리형 부품으로 나누어져 있는 부품에 결합을 위한 ‘약속’이다.
14) 오버로드 vs 오버라이드
a. 오버로드
- 같은 이름의 함수를 인자를 더 많이 확장된 함수
- 오버로드 생성자를 생각 할 것!
- 인자들을 적재해서 만든 함수
b. 오버라이드 :
-
부모 클래스의 메서드를 재정의하여 사용하는 것
-
부모 클래스의 메서드를 올라타서 재정의()하거나 고쳐쓰는 함수이다.
15) 제네릭 :
-
형식인데 무엇이든 될 수 있는 형식을 의미한다.
-
타입을 넣어주는 것에 따라서 정해진다.
-
클래스인데 타입을 넘겨받는 템플릿 형식의 클래스이다.** 형식이 어떠한 형식이 될 수 있다.
-
일부분의 형식이 비어져서 있어서 그 부분을 채워서
16) 배열 vs ArrayList
a. 배열
- 고정 길이의 저장소
b. ArrayList
- 가변 길이의 저장소, 추상(기능을 가지고 있다.) 데이터 타입, 콜렉션 기능을 구현하고 잇는 저장소 데이터를 add와 get 이러한 기능함수를 가진 데이터 저장소
17) Stack vs List
-
자료 구조 공부하기! 데이터 구조
-
Stack : 마지막 순서의 데이터를 제일 먼저 꺼낼 수 있는 데이터 구조임. 마지막 순서에 있는 데이터 구조를 자주 사용하는 경우에 사용한다. 추상화 데이터 구조(= 기능을 가지고 있는 데이터 구조),
-
LinkedList : 가운데 순서에 있는 데이터를 관리하기에는 LinkedList를 이용한다. 검색하기에는 첫 순서부터 찾아서 검색 속도가 매우 느리다.
-
ArrayList : 검색하기에는 LinkedList보다는 빠르다., 삽입, 삭제 시에는 자리가 비면, 순서를 뒤에서 앞으로 하나씩 미루기 때문에 비효율적이다.
18) Tree, Queue, Graph :
a. Tree
-
추가적으로 Full Scan하는 경우(도서관 검색)에는 책 코드별 조회가 많이 일어나서 다른 데이터 타입을 사용한다. 그래서 Tree 타입을 사용한다!**
-
그래서 저장소에서는 Tree 구조를 많이 이용한다.
b. Queue :
-
버퍼를 의미함. FIFO이다. 먼저 들어온 사람을 먼저 내보낸다.
-
메서지를 보낼 때, 사용한다. 또한, 줄을 설 때, 사용한다.
c. Graph
-
Vertex(꼭지점) 이용
-
각 역할들을 연결 짓기 위해서 사용한다.(사촌지간 관계 보여주기)
19) List, LinkedList 계열
-
콜렉션을 갖고 있고 이터러블을 물려받아서 사용한다.
-
LinkedList 계열 : Set, Map, Queue 계열
20) 접근 제어자 종류 정리 : private, protected
a. Private
- 클래스 내부에서만 사용된다.
b. Protected
- 부모가 protected를 써서 자식에게만 노출해준다.
- 하지만, 언제 쓰지? 자식 때문에 쓰는게 아니라(나중에 다른 자식 클래스 추가 시, 종속적으로 바뀐다.) 자식에게 책임을 전가할 때, 사용한다!!**
- 자식이 책임지도록 하며 자식에서 메서드를 직접 구현한다. 이것을 구현할 때는 abstract 메서드에 protected를 사용한다!
a) Protected 개념 적용 코드
-
아래 코드도 추상 메서드이다.
-
-
아래 코드는 당연히 추상 메서드이다. 이러한 경우에 자식 메서드에서 책임을 부여하여 protected의 접근 제어자를 적용시킬 수 있다.
-
21) 해시 코드
- 해시의 의미 : 식별자를 의미한다.
- Program.java
package main.java.test4.obj.identified;
import java.util.HashSet;
import java.util.Set;
public class Program {
public static void main(String[] args) {
String str1 = "hello"; // 상수형 객체는 1개만 만들어준다.
String str2 = "hello"; // 상수형 객체는 1개만 만들어준다. 추후에 더 이상 안 만든다.
// 사용자에 의해 new String에 의해 객체가 새로 만들어진다.
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str1 == str2); // '=='는 객체를 비교하고 // true
System.out.println(str1.equals(str2)); // 'equals'는 객체의 값만 비교 // true
// String은 클래스 타입이라서 객체로 인식한다.
// '=='는 객체를 비교하고
System.out.println(str3 == str4); // new String()이라서 false! 그래서, false이다.
// 'equals'는 객체의 값만 비교
System.out.println(str3.equals(str4)); // true!
// String은 클래스 타입이라서 객체로 인식한다.
Exam exam1 = new Exam(1, 2, 3);
// Exam exam2 = new Exam(1, 2, 3);
Exam exam2 = new Exam(1, 2, 4);
System.out.println(exam1 == exam2); // false
System.out.println(exam1.equals(exam2)); // true
// 하지만, 사용자가 만든 Object라면 해당 Object를 만든 사용자가 equals도 직접 만들어줘서 정해준다!
// 해시코드인 식별자는 런타임시, JVM에서 정해준다.
// 해시 값은 식별자이다.
// exam1, exam2는 hashCode 메서드가 사용자에 의해서 다시 재정의되어 만들어질 수 있다.**
System.out.println(exam1.hashCode()); // 112810359
System.out.println(exam2.hashCode()); // 2124308362
Set<Exam> set = new HashSet<>();
set.add(exam1);
set.add(exam2);
// 위의 Exam 인스턴스를 객체가 다른 2개로 인식한다.
System.out.println(set.size()); // 2
}
}
- Exam.java
package main.java.test4.obj.identified;
public class Exam{
int kor;
int eng;
int math;
@Override
public boolean equals(Object obj){
Exam exam = (Exam) obj;
return (this.kor == exam.kor) && (this.eng == exam.eng);
}
public Exam() {
}
public Exam(int kor, int eng, int math) {
this.kor = kor;
this.eng = eng;
this.math = math;
}
public int total(){
int result = 0;
result = kor + eng +math;
return result;
}
}
22) Hash Table, HashMap
- 기본적으로 키와 값을 저장하는 콜렉션이다.
a. Hash Table
-
일단 무겁다. 너무 예전에 만들어졌고 초창기 java에는 해시 테이블 밖에 없었다. 스레드에 안전해서 동기화가 가능하다. 락킹이 내제화 되어 있다.
-
식별값에 null을 넣을 수 없다. 마치 UQ와 같다.
-
Hash Table은 이터레이터말고 다른 enumeratable을 사용한다.
b. Hash Map
-
새로 발전되었고 Hash Table보다 경랑화 되어 있고 key-value 가능하다.
-
식별값에 null을 넣을 수 있다. 대신 식별을 위해서 1개만 넣을 수 있다.
-
Hash Map은 이터레이터를 이용한다.
23) JAVA 직렬화 : 아래 같은 데이터 타입 처리 방법
a. FileOutputStream
- 4바이트씩 파일의 데이터를 전송해야 한다.
b. DataOutputStream
- 파일의 문자열을 전송하고 싶으면 DataOutputStream으로 안 쓰면, 데이터를 바이트 단위로 보내야 한다.(FileOutputStream와 같은 상황이다.)
c. ObjectOutputStream
- 객체를 통째로 보내준다!
d. 실습 코드
- transient 개념 이용하기!
- Program1.java
package main.java.test5.serialize;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
public class Program1 {
public static void main(String[] args) {
Exam exam = new Exam(1,2,3);
// FileOutputStream : 4바이트 짜리 데이터를 여러번 보낼 수 밖에 없다?
FileOutputStream fos = new FileOutputStream("res/data.txt");
// DataOutputStream : 파일의 문자열을 전송하고 싶으면 DataOutputStream으로 안 쓰면, 데이터를 바이트 단위로 보내야 한
// DataOutputStream dos = new DataOutputStream(""res/data.txt"");
// ObjectOutputStream :해당 객체를 모두 내보낼 것인지 정렬을 어떻게 할것인지 설정도 해줘야 한다.
// 그래서, 그 객체가
// 그 객체를 읽기 위해서 무조건 FileInputStream으로 읽어야한다. 불편한다.
// 하지만, 요즘에는 JSON으로 쓰고 읽는다.
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(exam);
fos.close();
}
}
- Exam1.java
package main.java.test5.serialize;
import java.io.Serializable;
public class Exam1 implements Serializable{
int kor;
int eng;
// int math;
transient math;
@Override
public boolean equals(Object obj){
Exam exam = (Exam) obj;
return (this.kor == exam.kor) && (this.eng == exam.eng);
}
public Exam() {
}
public Exam(int kor, int eng, int math) {
this.kor = kor;
this.eng = eng;
this.math = math;
}
public int total(){
int result = 0;
result = kor + eng +math;
return result;
}
}
2. Web 개념 : 230512
1) 라이브러리 vs 프레임워크
-
라이브러리 : 재사용할 수 있는 코드. 그 중 라이브러리 중에 하나가 프레임워크다.
-
즉, 라이브러리 중에 ‘프레임워크’가 있다.
2) MVC 패턴?
-
model을 기준으로 Controller와 View가 나뉜다.
-
Controller에서 model이 만들어지고 그 model을 소개한다.(view)
-
MVC model1은 사용하지 않는다. 1개의 파일에서 MVC를 구성하기 때문이다.
-
요즘에는 MVC model2를 사용한다.
3) Pojo(순수 자바 코드)
-
Front Controller가 서블릿이고 이를 Pojo 컨트롤러라고 부른다.
-
프론트 컨트롤러를 가지고 쓰거나 없이 쓰거나 한다.
4) JSTL
-
태그 라이브러리
-
view단에서 화면을 제어하기 위해서 사용
5) JSP에서 세션을 꺼내고 사용하는 방법????
- 왜 여기서 꺼내지?
6) 서블릿, AJAX, 개념정리
7) Rest, Restful API 차이점
a. REST**
-
Representational State?? : 문서를 찾으면 어느 장소에 있는 상태를 말해주는 “경로 지정 방법”이다.
-
구조화된 데이터를 가지고 표현하는 것 : ‘REST’ 방식
-
자원의 요청하는 방식이 보통 웹에서 사용한다. 이것이 REST 방식이다. 이렇게 자원을 표기한다.
-
자원의 구조적, 계층적으로 표현하고 있는 방식**
b. Restful AP**
-
그러한 형태를 모두 모아서 Restful이라고 말한다.
-
웹서비스를 포함해서 다양한 이러한 형태의 자원을 제공해주는 자원제공제이다.
-
자원을 요청할 때, 요청할 때 사용할 수 있는 자원 상태의 표기법을 이용할 수 있는
-
Rest 방식을 이용하는 다양한 자원의 방식과 유사한 API
8) 세션 vs 쿠키
a. 세션
- 어떤 사용자가 서버를 사용할 수 있도록 하는 자원을 할당받은 기간을 의미한다. 세션 기간, 식별자(세션 키) 등등
b. 쿠키
- 사용자가 저장하게되는 값들을(클라이언트가 저장하게되는 값들을) 이야기한다.
9) jQuery? 사용법
- 지금의 jQuery 가장 중요한 기능이 Cross-Brower 기능이었다.
- 하지만, jQuery를 사용하지 않았다고 이야기 할 경우
- 시대적으로 Jquery 쓰임 가치가 떨어진다고 생각해서 쓰지 않았습니다.
- 원래 Jquery 기능 : Css 쿼리 셀렉터, 크로스 브라우저도 기본으로 된다. 30kB 아래 용량
- Vanilla JS : 이제는 기본적으로 여기서 위의 3가지 기능이 사용된다.