728x90
JVM(Java Virtual Machine)
- 말 그대로 자바를 실행하기 위한 가상 기계
- C, CPP은 운영체제에 종속적이라 컴파일한 코드를 바로 실행시킴
→ 윈도우에서 만든 것을 맥이나 리눅스 등에서 사용 불가능함 - Java의 경우 컴파일을 하면 바이트 코드(바이너리 코드)로 변하고 JVM이라는 가상 머신이 실행시킴.
- 메모리에서 JVM이 동작하다보니 아직까지 하드웨어를 사용하지 않았기 때문에 JVM만 설치되어 있다면 OS에 종속적이지 않게 실행시킬 수 있음
- 즉 플랫폼에 독립적임. Write Once, Run Anywhere
- 가상환경인 JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느린 단점이 있음
💡 바이너리 코드?
컴퓨터가 인식할 수 있는 0과 1로 구성된 이진 코드
가비지 컬렉션(Garbage Collection)
- JVM의 메모리 관리 기법 중 하나
- 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법
- 프로그램을 개발하다 보면 유효하지 않은 이런 메모리들이 발생하며 C언어의 경우 free()라는 함수를 통해 직접 메모리 해제를 해야하지만 가비지 컬렉터가 불필요한 메모리를 알아서 정리해 줌
- System.gc()를 이용해 호출은 가능하지만 호출하면 시스템의 성능에 큰 영향을 미치므로 절대 호출하면 안됨
OOP(Object Oriented Programming)
객체
- 객체는 주체가 아닌 것. 주체가 활용하는 것임
- 우리 주변에 있는 모든 것으로 프로그래밍의 대상이 됨. 사물, 개념 논리 등
객체지향 프로그래밍
- 주변의 많은 것들을 객체화해서 프로그래밍 하는 것
- 객체지향은 객체를 많이 만드는 것을 추천함.
- 많아야 잘 써먹고 그게 객체지향임
- 변경이 일어났을 때 내 코드를 많이 고칠 필요가 없음
- 유지보수가 용이함
- 한 번 만든 객체를 재사용해서 사용할 수 있음
- 빵집이라는 객체가 있다면 빵 한 번 만들고 없애지 않고 계속 사용하는 것과 같음
- 현실 생활 자체를 컴퓨터로 만드려고 한 것이 객체지향임
Class
- 변수만 나열한 객체는 C의 구조체랑 다를게 없음
- 클래스는 여기에 함수(동작)까지 넣어서 완성됨
- 자동차라는 클래스에는 자동차를 구성하는 차체, 바퀴뿐 아니라 직진,후진 등의 동작이 들어가서 완성되고 이런걸 클래스라고 하는 것임
Instance
- 객체를 소프트웨어에 실체화하면 인스턴스라고 부름
- 그래서 인스턴스는 객체에 포함된다고 볼 수 있음
- 실체화된 인스턴스는 메모리에 할당됨
- OOP의 관점에서 객체가 메모리에 할당되어 사용될 때 인스턴스라고 부름
객체지향 언어의 특징
상속
- 기존 클래스의 자산(멤버)을 자식 클래스에 재사용하기 위한 것
- 부모의 생성자와 초기화 블록은 상속하지 않음
- 기존 클래스의 멤버를 물려받기 때문에 코드가 간결해짐
- 부모의 코드를 변경하면 모든 자식들에게도 적용되기 때문에 유지 보수성도 좋아짐
- 상속은 extends 키워드를 사용함
public class Person{
String name;
void eat(){}
void walk(){}
}
//사람의 속성을 상속 받고 자기 자신의 고유의 속성을 가짐
public class IronMan extends Person{
boolean isIronMan;
void fly(){}
}
- 아이언맨은 총 5개의 멤버를 가지고 있는 것임
- 아이언맨도 사람이니 매번 사람의 속성들을 적어줄 필요 없이 사람의 속성들을 물려받는 개념임
- Object 클래스
- 모든 클래스의 조상 클래스로 extends가 없는 클래스들 앞에 생략되어 있음
- 모든 클래스에는 Object 클래스에 정의된 메소드들인 hashCode(), equals(), toString() 등이 있음
- 자바는 단일 상속만 지원함
- 다중 상속이 필요한 경우 interface와 포함 관계로 단점을 극복함
- 여기서 포함 관계는 멤버 변수로 처리한다는 의미
- 메소드 오버라이딩(overriding)
- 조상 클래스에 정의된 메소드를 자식 클래스에서 적합하게 수정하는 것
- 조건
- 메소드 이름이 같아야 함
- 매개 변수의 개수, 타입, 순서가 같아야 함
- 리턴 타입이 같아야 함
- 접근 제한자는 부모보다 범위가 넓거나 같아야 함
- 조상보다 더 큰 예외를 던질 수 없음
- @Override
- toString 의 경우 그냥 호출하면 주소값이 나옴. 그래서 아래와 같이 원하는 값을 리턴하게 만들어주는 것
@Override
public String toString(){
return "주소값 말고 원하는 문자열";
}
- 메소드 오버로딩(Overloading)
- 비슷한 것으로 오버로딩이란 것이 있는데 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러개 정의하는 것을 의미하며 이때 오버라이딩과 마찬가지로 메소드 이름은 같아야 함
- 매개변수의 개수를 다르게 하는 대표적인 예시로는 생성자가 있음
- 타입을 다르게 하는 대표적인 예시로는 println()이 있음
- println의 경우 안에 숫자를 넣으면 숫자가 출력, 문자를 넣으면 문자가 출력됨
다형성
- 하나의 객체가 많은 타입을 가질 수 있는 성질
- 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스 할 수 있다.
- 자식 객체는 조상 객체 + a 이므로 조상 객체의 성질을 모두 가지고 있으니 가능하다
- 반대로 조상 객체는 자식 객체의 성질이 모두 있지 않으므로 반대는 불가능하다
- 다형성으로 다른 타입의 데이터를 하나의 배열로 관리할 수 있다
Person [] persons = new Person[10];
persons[0[ = new Person();
IronMan [] ironMans = new IronMan[10];
ironMan[0] = new IronMan();
//위에처럼 할 필요 없이 아래처럼 사용할 수 있다.
Person [] persons = new Person[10];
persons[0] = new Person();
persons[1] = new IronMAn();
추상화
- 여러가지 사물이나 개념에서 공통되는 특성을 묶어 이름을 붙이는 것
- 자바에서 추상화는 공통된 행동, 필드를 묶어 하나의 클래스를 만드는 것을 의미함
- 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말함
- interface는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말함
→ 알맹이는 내가 만들어야 함
- 예시로 철수와 영희는 사람이라는 추상 클래스를 만들 수 있음
public class Person{
String name;
void eat(){
System.out.println("yummy");
}
void walk(){}
}
Person p = new Person();
p.name = "철수";
p.eat();
캡슐화
- 데이터를 외부에 직접 노출시키지 않고 메소드를 이용해 보호할 수 있음
- 접근 제한자를 이용해서 원하는 것만 노출시킬 수 있으며 범위도 지정할 수 있음
- private
- 내가 원하지 않는 값이 들어가는 것을 원치 않아서 사용
→ 프로그램이 돌아가다가 해당 변수에 이상한 값이 들어가는 것을 방지 - 예시로 온도라는 변수가 갑자기 10000도가 된다면 문제가 되니 setter를 사용해서 일정 범위에서만 세팅되도록 하는 것임
- 자바 개발자끼리 암묵적으로 변수는 private를 사용하고 getter,setter를 사용함.
→ 안정성을 위해 캡슐화를 하자는 의미
- 내가 원하지 않는 값이 들어가는 것을 원치 않아서 사용
- protected
- 건드릴 순 있는데 new를 사용하여 새로운 것을 생성하지는 못함
- 즉 외부에서는 접근이 안되고 상속받는 쪽이면 ‘ . ‘ 찍어서 접근이 가능함
- public
- 마음대로 사용. ‘ . ‘ 찍어서 마음대로 접근이 가능
- package(default)
- 같은 패키지안에 들어있다면 접근이 됨
- private < package < protected < public 순의 확장단계
- private
장단점
- 위처럼 다중 상속이나 타입에 엄격하며 제약이 많은 단점
- 하지만 그만큼 제약이 많기 때문에 안정성이 높아짐
싱글톤 패턴
- 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴
- 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우나 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용
- 도서관에 사서가 많을 필요가 없음. 책을 찾을 때마다 새로운 사서를 new() 하는 것이 아니라 처음에만 new()해서 사서가 있다면 이후에는 그 사서에게 해당 책이 어디있는지 물어보는 방식의 디자인 패턴임
- Spring에서 대표적인 예시로는 Spring Bean이 있음
- 스프링의 빈 등록 방식은 기본적으로 싱글톤 스코프이고 스프링 컨테이너는 모든 빈들을 싱글톤으로 관리함
- 스프링은 @Scope(”prototype”)을 사용해서 요청할 때마다 새로운 객체를 생성하여 반환하는 기능도 제공함
728x90
'Java > Java' 카테고리의 다른 글
Java 양방향 Socket 통신시 발생한 에러(socket is closed, 무한 readLine) (0) | 2023.12.05 |
---|---|
자바 다시 학습 하면서 알게된 것(제네릭, Collection, Map) (0) | 2023.11.13 |
try-with-resources를 사용하면 정말 close()가 호출될까? (0) | 2023.10.14 |
[Java] 가비지 컬렉션(Garbage Collection)과 5가지 알고리즘 (0) | 2023.04.23 |
[Java] 불변 객체와 final을 사용해야 하는 이유(feat.정적 팩토리 메소드) (0) | 2023.04.23 |