1. JDK 설치
- JDK : JRE + JVM
- JRE : 라이브러리 / 사용하면서 공부
사용한 Lib) Scanner, Random, Stream 메서드
- javac : .class 파일
- java.exe : 컴파일러를 실행시키는 프로그램
.class 파일로 변환
2. Intelli J 설치
- 다른 Tool들도 사용해봐야 함
3. 변수와 자료형
- 연산자
- 가정법
- 반복문
- 배열
4. 클래스와 객체
- 추상 클래스 : 객체x, ew할 수 x
- 클래스 : 설계도, 객체, ew할 수 o
heap에 뜸
- heap : 동적 메모리
원하는 시점에 띄워지고
사라지는건 가비지 컬렉션에 의해 사라짐
- static : 정적 메모리
한번 띄워지고 끝까지 유지됨
- 클래스의 상태 : 클래스가 가진 변수
- 상태 = heap 변수, member 변수, 필드
디버깅할때 오류난 메세지로는 필드로 표기
변하지 않는 상태 : final
변하는 상태 : private
상태를 변경할 때 : public
생성자
getter, setter(변하는 것만)
ex) 성별은 남, 여로 변하지 않음
몸무게는 변함
메서드를 상태 상태를 변경해야 함
상태는 행위를 통해 변경되어야 함
- 오버로딩을 많이 함
같은 이름이지만 인수(파라미터)가 다를 때 사용
메서드 오버로딩을 많이 사용함
- 동적 바인딩
추상클래스
자연스럽게 만들어짐
- 접근제어 : public, private, protected(자식만 사용가능)
- 객체의 생성 : new
- 소멸 : 가비지 컬렉션
5. 상속
- 상속의 목적 : 다형성(타입 불일치)
ex) 왕, 왕비 → 재판관
- 물려받을 땐 컴퍼지션하기
SOLID 원칙
- SRP : 단일 책임 원칙
한 클래스는 하나의 책임만 가져야 한다.
책임을 나눠야 디버깅하기 편함
* 메서드도 하나의 책임을 가지는 것이 좋음
- OCP: 개방 폐쇄 원칙
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
메서드 재정의해서 동적바인딩 해야함
새로운 클래스 생성에는 열려있으나 기존 코드를 손대는 것을 막는 것
실수할 가능성) 추상클래서, 인터페이스 → 강제 오버라이드 하게 해야 함
-LSP: 리스코프 치환 원칙
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
서브 타입(자식)은 언제나 기반 타입으로 교체할 수 있어야 함
타입을 어떻게 바꾸든 계속 동작해야 함
메서드 이름을 통일하게 설계해야 함 → 바꾸는 순간 동적 바인딩이 안됨
class 사각형 { protected int height; protected int width; public void 넓이확인() { System.out.println(height * width); } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } } class 정사각형 extends 사각형 { @Override public void setWidth(int width) { if (height == 0) { this.width = width; return; } if (width == height) { this.width = width; return; } System.out.println("정사격형은 width, height가 동일해야 합니다.") } @Override public void setHeight(int height) { if (width == 0) { this.height = height; return; } if (height == width) { this.height = height; return; } System.out.println("정사격형은 width, height가 동일해야 합니다."); } public void 넓이확인() { if (height == 0 || width == 0) { System.out.println("오류"); return; } System.out.println(height * width); } } public class Hello { public static void main(String[] args) { 정사각형 s1 = new 정사각형(); s1.setWidth(10); s1.setHeight(10); s1.넓이확인(); } }
-ISP: 인터페이스 분리 원칙
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
클래스를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
분리해서 만들어야 함.
행위의 제약이 여러 개면 인터페이스를 다른 클래스에서 모두가 아니라
일부만 사용하고 싶은 경우 재사용이 안됨
interface CookAble { void cook(); } interface KnifeAble { void kill(); } class 백종원 implements CookAble { @Override public void cook() { } } class 전사 implements KnifeAble, CookAble { @Override public void kill() { System.out.println("공격"); } @Override public void cook() { System.out.println("요리"); } } public class Hello { public static void main(String[] args) { } }
* 인터페이스 : 행위를 제약시키는 것
* 어댑터 클래스 : 뜰채, 안뜨는 메서드를 걸러냄
* 인터페이스 내에 DEFAULT를 하면 제외하고 구현 가능
* 설계자 외에 구현자가 그 메서드를 왜 구현하지 않았는지 알 필요 없이 그냥 구현하면 됨
-DIP: 의존관계 역전 원칙
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
바라보는게 추상 클래스가 되게 만들어야 한다.
6. 추상 클래스
- new할 수 x
- 추상 메서드를 가지고 있음
- 자식 클래스들을 만들고 추상 클래스를 설계하는 것
7. 인터페이스
- 메서드들을 강제화시키는것
8. 제네릭
- new 할 때 타입을 결정하는 것
- static으로 떠 있고 타입을 모를 때는 object로 설계해야 함
→ 다운 캐스팅해서 사용
9. ArrayList
- 동기화x vs 벡터 : 동기화 O
- 메서드
add() : 객체에 데이터를 추가
set(index, object) : 지정된 위치에 있는 데이터 교체
remove() : 지정된 위치에 있는 데이터 삭제
get() : 데이터 반환
10. Hash Map
- Map : 키-값의 형태, 중복된 자료를 가질 수 없음
11. Set
- 순서에 상관없이 데이터만 저장
- 동일한 데이터를 중복해서 가질 수 없음
12. 람다식
- ( → {})
13. Stream API
- Stream의 용도 : 가공
OS레벨의 데이터 타입, 바이트 관리
- 물길에 던지기 / 무조건 순차적 접근만 가능함, 바로 접근 불가
- 가공(map, filter)하기
- 수집하기 / toList()를 통해 바로 접근 가능
데이터를 스트림화 ⇒ 바이트화
물길에 데이터를 던짐 : OS 타입 → 가공 → 자바가 자바 타입으로 수집
14. IO
- Stream : 버퍼로 들어가는 선
- 바이트 스트림 : 바이트 단위를 사용 → 끈어서 읽어야 함
데이터 유실의 가능성 → 보조 스트림(크기 고정) → 버퍼(가변)
- 버퍼 : BufferedReader, BufferedWrite 구분
15. 스레드
- 동시 실행 X
- 컨텍스트 스위칭 : 동시 실행처럼 보임
→ UX가 좋아짐, IO 처리시 멍 때리는 시간 감소
16. TCP
- 3way hand shake
- OS레벨에서 자동으로 실행됨
- 신뢰성 있는 통신
17. UDP
- 막 던지는 것
- 동영상 스트림에 유실
- 신뢰성 없는 통신
18. 소켓
- 애플리케이션과 OS의 매개체
- 애플리케이션과 OS가 파일(=소켓)을 통해 통신함
내부에서 사용 : 파일
외부통신에 사용 : 소켓
- 소켓에는 IP와 Port번호가 있음
- 세그먼트 : 재조립 하기
패킷 : 목적지 찾기
프레임 : 가장 가까운 라우터 찾기 : 동적
전송
19. 단방향 통신
- 버퍼, 소켓, IP, Port번호, 서버, 클라이언트, 리스너
- 리스너 : 소켓 = 서버 소켓 : 요청받는 곳, 연결용
연결후 연결이 끈기고 랜덤Port번호를 가진 소켓 생성
BufferedReader
- 클라이언트 : 요청을 하는 곳
BufferedWriter
Share article