JAVA
자바의 특징
객체지향 프로그래밍(OOP)
- 객체들의 집합으로 프로그램의 상호 작용을 표현
- 데이터를 객체로 취급하여 객체 내부에 선언된 메소드를 활용하는 방식
- 설계에 많은 시간이 소요되고 처리 속도가 느림
객체 지향 프로그래밍의 특징
추상화
캡슐화
- 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉
다형성
- 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리
- 오버로딩
- 오버라이딩
상속성
- 상위 클래스의 특성을 하위클래스가 이어받아 재사용하거나 확정하는 것
오버로딩과 오버라이딩
오버로딩
- 같은 이름을 가진 메서드를 여러개 두는것을 말함.
- 메서드의 타입, 매개변수의 유형, 개수 등이 달라짐
- 컴파일 중에 발생하는 정적 다형성
오버라이딩
- 상위 클래스로부터 상속받은 메서드를 하위클래스에서 재 정의하여 사용하는 것
- 런타임 중에 발생하는 동적 다형성
OOP의 장점과 단점
장점
단점
OOP 5가지 설계 원칙
단일책임원칙
개방-폐쇠원칙
리스코프치환원칙
- 프로그램의 정확성을 깨드리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 함
인터페이스분리원칙
- 일반적인 인터페이스 보다는 구체적인 여러개의 인터페이스를 만들어야 함
의존 역전 원칙
- 추상화된 인터페이스나 상위클래스를 두어 변하기 쉬운것의 변화에 영향을 받지 않게 하는 원칙
자바의 장점
- JVM위에서 동작하기 때문에 운영체제에 독립적이다.
- 가비지 컬렉터를 통해서 자동적인 메모리 관리가 가능
자바 단점
- JVM 위에서 동작하기 때문에 실행속도가 상대적으로 느림
- 다중 상속이나 타입에 엄격하며, 제약이많음
자바 JVM 역할 설명
- JVM은 스택 기반으로 동작하며 자바 바이트 코드를 OS에 맞게 해석해주는 역할을하며 가비지 컬렉션을 통해 자동적인 메모리 관리를 해줌
자바 컴파일 과정
- .java 파일 생성
- 빌드
- 컴파일러를 통해 바이트 코드를 생성
- 클래스 로더를 통해 JVM 메모리 내로 로드
- 실행 엔진을 통해 각 운영체제에 맞는 기계어로 해석
생성자
- 클래스와 같은 이름의 메서드로, 새 객체가 생성될 때 호출되는 메서드
- 파라미터를 다르게 해 오버로딩 할 수 있음
자바 원시 타입과 각 몇 바이트를 차지하나?
- 정수형 byte(1), short(2), int(4), long(8)
- 실수형 float(4), double(8)
- 문자형 char (2)
- 논리형 boolean (1)
지역변수
- 메서드 안에서 정의되어 메서드 안의 스코프에서만 존재
인스턴스변수
- 클래스에서 정의되어 클래스 전체의 스코프 안에서 존재
- 필드라고 생각하면 됨
객체
인스턴스
- 객체에 메모리가 할당되어 실제로 활용되는 실체
클래스란?
메소드란?
- 클래스에 종속되어 인스턴스와 연결되어 있는 어떤 특정 작업을 수행하기 위한 명령문의 집합
불변 객체란?
- 객체 생성 이후 내부의 상태가 변하지 않는 객체
- 자바에서는 필드가 원시타입일 경우 final을 사용해 불변 객체를 만들수 있음
참조 타입
불변 객체나 final을 사용해야하는 이유?
- 메소드 호출 시 파라미터 값이 변하지 않는 것을 보장
- 부수효과를(변수의 값이 변함)피해 오류 최소화
상속
- 자식 클래스가 부모 클래스의 메서드 등을 상속받아 사용
- 자식 클래스에서 추가 및 확장을 할 수 있는 것
- 재사용성, 중복성의 최소화
구현
- 부모 인터페이스를 자식 클래스에서 재정의하여 구현
- 상속과는 달리 반드시 부모 클래스의 메서드를 재 정의 해야함
추상클래스
- 클래스 안에 추상메서드가 하나 이상 포함되거나 abstract로 정의된 경우
- 상속 받아서 기능을 이용하고 확장할 수 있음
- static이나 final이 아닌 필드를 가질 수 있음
- 일반 변수, 메서드를 가질 수 있음
- 인스턴스를 생성할 수 없음
- 다중 상속 불가능함
인터페이스
- 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말함
- 상수(static final)와 추상메서드의 집합
- 추상 클래스와 다르게 구현부가 있는 일반 메소드와, 일반 멤버 변수를 가질 수 없음
- 다중 구현이 가능
- 인스턴스를 생성할 수 없음
- 상속받은 클래스는 반드시 추상 메서드를 구현해야 한다.
공통점
- new 연산자로 인스턴스 생성 불가능
- 사용하기 위해서는 하위 클래스에서 확장/구현 해야 한다.
차이점
- 인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함
출처 https://code-lab1.tistory.com/287
Call by value
- 값에 의한 호출
- 함수 호출 시 전달되는 변수의 값을 복사하여 함수의 인자로 전달
- 복사된 인자는 함수의 지역변수로 사용
call by reference
- 참조에의한 호출
- 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달
- 함수 안에서 인자의 값이 변경되면,함수 호출시에 있던 변수들도 값이 변함
자바의 경우 데이터 타입에 따라서 함수 호출 방식이 달라짐
- 기본형 : call by value (int, short, long, double, boolean, char)
- 참조형 : call by reference (Array, Class instace, String)
불변객체 STRING
- 한번 값이 할당되면 변하지 않음 (불변)
- 값을 변화시킬 때, heap에 새로운 메모리를 사용하고, 참조되는 주소만을 바꿔줌
String이 불변인 이유
- 강제로 참조에 대한 문자열 값을 변경하는 것이 불가능해서 보안에 유리
- 여러 스레드에서 동시에 특정 객체를 참조하더라도 안전함
STRING/ STRING BUILDER / STRING BUFFER
STRING
- 한번 값이 할당되면 변하지 않음 (불변)
- 값을 변화시킬 때, heap에 새로운 메모리를 사용하고, 참조되는 주소만을 바꿔줌
- 불변이라는 특징으로 인해 이를 해결하기위해 string builder, string buffer 클래스 사용
STRING BUILDER 클래스
-
문자열을 더할 때 새 객체를 생성하는 것이 아니라 기존 문자열에 더하는 형식이라 속도가 빠름
-
동기화를 지원하지 않기에 멀티 스레드 환경에서 사용하는 것은 적합하지 않음
-
단일스레드에서는 String buffer보다 성능이 뛰어남
STRING BUFFER 클래스
가비지 컬렉터
- 더 이상 참조되지 않는 메모리/ 객체를 정리해주는 역할
- HEAP 영역 위주로 탐색하여 메모리를 정리해 줌
제네릭
- 타입을 일반화하는 것으로 클래스 내부에서 정하는 것이 아닌 사용자 호출에 의해서 결정하는 것
- 재사용성 증가/ 컴파일 시 에러 발견 가능
자바 메모리 영역
METHOD
- 전역변수와 static변수를 저장하며, 메소드 영역은 프로그램의 시작부터 종료까지 메모리에 남아있음
- JVM이 동작해서 클래스가 로딩될 때 생성
HEAP
- 동적 할당할 때,인스턴스, 배열 등이 힙 영역에 저장
- 가비지컬렉션에 의해 메모리가 관리됨
- 런타임 당시 할당
STACK
- 메소드 호출 정보, 지역변수, 매개변수들이 저장되는 공간
- 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제
- 컴파일 당시 할당
- 스택영역은 동적으로 크기가 늘어날 수 있기에 힙과 영역이 겹치면 안돼서 힙과 스택 사이에 공간을 비워 둠
Wrapper class
- 기본 자료형에 대한 객체 표현
- 기본 자료형을 래퍼 클래스로 변환하는 것을 박싱
- 래퍼 클래스에서 기본 자료형으로 변환하는 것을 언박싱
new String()과 리터럴("") 차이
- new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장
- 리터럴은 heap 안에 있는 String Pool 영역에 저장
참조 = https://dev-coco.tistory.com/153
접근 제한자
- 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용
- public 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
- protected 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
- default 해당 패키지 내에서만 접근 가능
- private 해당 클래스에서만 접근 가능
클래스 멤버 변수 초기화 순서
- static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화
- 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화
- 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking( thread-safe 영역 )
static이란?
- static 키워드를 사용한 변수,메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용 가능
- 즉 인스턴스 생성없이 사용 가능함
- 모든 객체가 메모리를 공유한다는 특징이 있음
- 가비지 컬렉터 관리 영역 밖에 있어 프로그램이 종료 될 때까지 메모리에 값이 유지
static을 사용하는 이유
- 인스턴스 생성 없이 바로 사용이 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 사용
전역변수
- class 안의 전체영역에서 사용하는 변수
- 전역변수 값은 new 를 만나면 초기화
- 초기화 없이 값을 유지하려면 static 사용
정적(static)변수
- 여러 인스턴스가 공유해서 사용할 수 있는 변수
Inner class 장점
- 내부 클래스에서 외부 클래스의 멤버에 손 쉽게 접근
- 관련 있는 클래스를 묶어서 캡슐화를 증가
- 외부에서는 내부클래스를 접근할 수 없어서 보안성 높임
에러와 예외의 차이
- 에러는 실행 중 일어날 수 있는 치명적인 오류로 컴파일 시에 체크 안됨
- 예외는 트라이 캐치 문으로 프로그램의 비정상 종료를 막을 수 있음
컬렉션 프레임 워크
- 다수의 데이터를 쉽고 효과적으로 관리할 수 있는 클래스의 집합
LIST
- 순서가 있는 데이터 집합
- 중복 허용
- Arraylist, Vector, LinkedList, Stack, Queue
SET
- 순서가 없는 데이터 집합
- 중복 허용 안 함
- HashSet/ 순서 보장을 위해서는 LinkedHashSet
MAP
- 키와 값이 쌍을 이루는 데이터 집합
- 중복을 허용하지 않으며 순서가 없음
- key의 순서를 보장하기 위해서는 LinkedHashMap을 이용
STACK
QUEUE
- 큐인터페이스는 linkedList에 new 키워드를 적용해 사용
- FIFO 구조
fianl
- 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용
출처 https://dev-coco.tistory.com/153