일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 메소드
- JPA
- 0으로변환
- 생성자
- 코린이
- 웹동작방식
- 레포지토리설계
- 웹스토리지 사용법
- 엔티티설계
- java
- qclass
- 한번에insert하기
- 상속
- 오버라이딩
- http
- 스프링시큐리티
- 자바
- MySQL
- 업캐스팅
- 다운캐스팅
- 기초
- 프로젝트
- 형변환
- Git
- java기초
- static
- git commit취소
- 파비콘에러
- 스프링부트
- 네트워크
- Today
- Total
딱콩이의 봄
JAVA공부 본문
OOP의 특징
모든 데이터를 객체 취급하며, 처리 요청을 받은 객체는 객체 그 안의 기능을 사용해 요청을 처리합니다.
1. 캡슐화
실제로 구현 부분을 외부에 드러나지 않도록 하고, 데이터를 외부에서 직접 접근하지 않고 함수를 통해서만 접근합니다.
2. 상속
자바의 모든 class는 Object 클래스의 후손이고, 단일 상속만 지원합니다. 자식 클래스가 부모 클래스의 특성과 기능을 물려받아, 기능의 일부분을 변경하는 경우 자식 클래스에서 상속받아 수정 및 사용하고, 캡슐화를 유지하며, 클래스의 재사용이 용이하도록 합니다. 부모 클래스의 생성자, 초기화 블록은 상속되지 않습니다.
- is a(상속 관계): 자식 클래스는 (하나의) 부모클래스이다.
- has a(연관관계):한 클래스 멤버 변수로 다른 클래스 타입의 참조 변수를 선언한다.
3. 추상화
인터페이스로 클래스들의 공통적인 특성(변수, 메서드)들을 묶어 표현합니다. 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미이기도 합니다.
4. 다형성
어떤 변수, 메서드가 상황에 따라 다른 결과를 내는 것입니다.
ex) 오버 로딩, 오버 라이딩
OOP의 5원칙(SOLID)
S.(Single Responsibility Principle)
한 클래스는 하나의 책임만 가져야 합니다.
O.(Open/Close Principle)
확장에는 열려있으나, 변경에는 닫혀 있어야 합니다.
L.(Liskov's Substitution Principle)
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 합니다.
I.(Interface Segregration Principle)
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫습니다.
인터페이스를 클라이언트에 특화되도록 분리시켜 설계해야 합니다.
D.(Dependency Inversion Principle)
추상화에 의존해야 합니다. 구체화에 의존하면 안 됩니다.
추상 클래스와 인터페이스의 공통점과 차이점
- 추상 클래스
클래스 내 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우
- 인터페이스
모든 메서드가 추상 메서드로만 이루어져 있는 것
공통점
new연산자로 인스턴스 생성이 불가능합니다.
사용하기 위해 하위 클래스에서 확장/구현을 해야 합니다.
차이점
인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제함에 있고,
추상 클래스는 상속받는 클래스들의 공통적인 조직을 추상화시키고 기능 확장을 위해 사용합니다.
추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능합니다.
변수의 종류
클래스 변수
static 키워드가 붙은 변수입니다. 클래스 변수는 해당 클래스의 모든 인스턴스가 공통된 값을 공유하게 됩니다. 따라서 한 클래스의 모든 인스턴스가 공통적인 값을 가져야 할 때, 클래스 변수로 선언합니다.
클래스가 로딩될 때 생성되어(그러므로 메모리에 딱 한번 올라갑니다) 종료될 때까지 유지되는 클래스 변수는 Public을 붙이면 같은 프로그램 내에서 어디서든 접근이 가능한 전역 변수가 됩니다.
인스턴스 생성 없이 접근할 수 있으므로 클래스 이름. 클래스 변수(Test.cv)를 통해 접근할 수 있으며, 메서드 영역에 올라가고, 주로 공유의 목적으로 사용합니다.
인스턴스 변수
인스턴스가 생성될 때 생성됩니다. 따라서 인스턴스 변수를 사용하기 전에 먼저 객체를 생성해야 합니다. 인스턴스 변수는 독립적인 저장 공간을 가지므로 인스턴스 별로 다른 값을 가질 수 있습니다.
따라서 각 인스턴스마다 고유의 값을 가져야 할 때는 인스턴스 변수로 선언하고 , 힙 영역에 올라갑니다.
지역변수
메서드 내에 선언되며 메서드 내에서만 사용할 수 있는 변수입니다. 메소드가 실행될 때 메모리를 할당 받으며 메소드가 끝나면 소멸되어 사용할 수 없게 되고, 스택영역에 올라갑니다.
메모리 구조
메소드 영역
클래스에 대한 정보와 함께 클래스 변수가 저장되는 영역이고 , JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일을 읽어 들여, 클래스에 대한 정보를 메서드 영역에 저장합니다.
힙 영역
모든 인스턴스 변수(멤버 변수)가 저장되는 영역입니다. new키워드를 사용해 인스턴스가 생성되면 해당 인스턴스의 정보를 힙 영역에 저장하고, 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
스택 영역
메서드가 호출될 때, 메서드의 스택 프레임이 저장되는 영역입니다. 메서드 호출시 메소드 호출과 관계되는 매개변수와 지역변수를 스택 영역에 저장하고, 스택 영역은 메서드의 호출과 함께 할당되며 메소드의 호출이 완료되면 소멸합니다.
후입 선출(LIFO)의 구조를 갖고 있으며, 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
Reflection이란?
구체적인 클래스 타입을 알지 못해서, 그 클래스의 메서드와 타입 변수들을 접근할 수 있도록 해주는 자바 API입니다.
어떤 경우에 사용되나요?
코드를 작성할 시점에 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행하는 경우입니다.
→java.lang.reflect 패키지 아래에서 리플랙션에 필요한 클래스들이 제공됩니다.
리플렉션은 오브젝트를 사용함으로써 실행될 수 있는 클래스의 메서드들과 오브젝트가 속한 클래스에 대한 정보를 제공합니다.
리플렉션을 통해 접근 제어자에 상관없이 런타임에 메서드를 호출할 수 있습니다.