==☕ 자바 핵심 개념 요약==

자바가 탄생한 이유와 그 혁신

자바가 프로그래밍 세계에 등장하기 전, 소프트웨어 개발자들은 중대한 문제에 직면했습니다. 바로 플랫폼 종속성이라는 문제다. 당시에는 각 운영체제(예: 윈도우, macOS, UNIX)에 맞는 애플리케이션을 따로 개발해야 했다. 이는 하나의 프로그램을 여러 플랫폼에서 사용하려면 각각의 환경에 맞춰 코드를 다시 작성해야 한다는 것을 의미했다. 즉, 개발 시간과 비용이 기하급수적으로 늘어나는 비효율적인 상황이었다.

이러한 문제를 해결하기 위해 1995년 썬 마이크로시스템즈(Sun Microsystems)에서 자바를 공개했다. 자바의 핵심 철학은 WORA(Write Once, Run Anywhere), 즉 ‘한 번 작성하면 어디서든 실행된다’이다. 이 혁신적인 개념은 개발자가 운영체제에 상관없이 동일한 코드를 작성할 수 있게 해주었다. 어떻게 이것이 가능했을까? 그 비밀은 바로 **JVM(Java Virtual Machine)**에 있다.

JVM은 운영체제와 자바 애플리케이션 사이에 존재하는 가상의 컴퓨터다. 개발자가 작성한 자바 코드는 JVM이 이해할 수 있는 중간 언어인 **바이트코드(Bytecode)**로 변환된다. 이 바이트코드는 특정 운영체제에 종속되지 않는 범용적인 형태다. 각 운영체제에는 해당 운영체제에 맞게 설계된 JVM이 존재하며, 이 JVM이 바이트코드를 읽어 각 운영체제에 맞는 기계어로 번역하여 실행한다. 덕분에 개발자는 운영체제별로 다른 코드를 작성할 필요 없이, 오직 하나의 자바 코드로 모든 플랫폼에서 프로그램을 실행할 수 있게 된 것이다.

JVM과 자바 애플리케이션의 실행 과정

자바 애플리케이션이 실행되는 과정은 크게 세 단계로 나뉜다. 이 과정은 자바의 동작 원리를 이해하는 데 필수적이다.

  1. 컴파일 (Compilation): 개발자가 .java 확장자를 가진 소스 파일을 작성하면, 자바 컴파일러(Javac)가 이 파일을 바이트코드(.class 확장자)로 변환한다. 이 바이트코드는 0과 1로 이루어진 기계어가 아니며, JVM이 이해할 수 있는 일종의 가상 기계어다.

  2. 클래스 로딩 (Class Loading): 생성된 바이트코드(.class 파일)는 JVM의 **클래스 로더(Class Loader)**가 읽어서 JVM 메모리 영역으로 적재한다. 이 과정에서 바이트코드의 유효성을 검사하고, 필요한 클래스들을 메모리에 올린다.

  3. 실행 (Execution): 메모리에 올라온 바이트코드는 **실행 엔진(Execution Engine)**에 의해 실행된다. 실행 엔진은 바이트코드를 실제 운영체제가 이해할 수 있는 기계어로 변환하고 실행한다. 이 과정에서 JIT(Just-In-Time) 컴파일러가 바이트코드를 더 효율적인 기계어로 즉시 컴파일하여 실행 속도를 최적화한다.

JVM 메모리 구조 심층 분석

자바가 실행될 때 JVM은 효율적인 관리를 위해 내부 메모리를 여러 영역으로 나눈다. 이 구조를 이해하면 프로그램의 성능을 개선하고 메모리 관련 오류를 해결하는 데 큰 도움이 된다. JVM 메모리 구조는 크게 스레드 공통 영역과 스레드별 영역으로 나뉜다.

메모리 영역설명특징
메소드 영역 (Method Area)클래스 정보, 필드, 메소드, 정적(static) 변수와 같은 프로그램의 공통적인 구조를 저장한다.JVM 시작 시 생성, 모든 스레드가 공유.
힙 영역 (Heap Area)런타임에 동적으로 생성되는 모든 객체(인스턴스)와 배열이 저장된다.GC의 주 대상이며, 모든 스레드가 공유.
스택 영역 (Stack Area)메소드 호출과 관련된 정보(매개변수, 지역 변수, 리턴 값 등)를 저장한다.각 스레드별로 독립적으로 할당되며, 메소드 호출 시 생성되고 종료 시 소멸.
PC 레지스터 (PC Register)현재 실행 중인 JVM 명령어의 주소를 저장한다.각 스레드별로 독립적으로 할당.
네이티브 메소드 스택 (Native Method Stack)자바 외의 언어(C, C++)로 작성된 코드를 실행하기 위한 스택이다.각 스레드별로 독립적으로 할당.

힙 영역과 스택 영역의 차이

  • 힙(Heap): 동적 할당의 영역이다. 프로그램 실행 중에 생성되는 객체들이 이곳에 저장되며, 개발자가 직접 메모리를 해제하지 않아도 GC가 관리한다.

  • 스택(Stack): 정적 할당의 영역이다. 메소드 호출과 함께 생성되는 지역 변수들이 여기에 쌓이며, 해당 메소드가 종료되면 자동으로 소멸한다.

가비지 컬렉션 (GC): 메모리 자동 관리 시스템

자바 개발자에게 메모리 관리가 편리해진 가장 큰 이유 중 하나는 **가비지 컬렉션(Garbage Collection, GC)**이다. GC는 JVM의 핵심 기능 중 하나로, 더 이상 사용되지 않는 객체들을 메모리(특히 힙 영역)에서 자동으로 제거하여 메모리를 확보하는 역할을 한다. 과거 C++ 같은 언어에서는 개발자가 직접 메모리를 할당하고 해제해야 하는 부담이 있었다. 이는 메모리 누수(Memory Leak)와 같은 심각한 버그로 이어지기 쉬웠다.

GC의 작동 원리 가장 일반적인 GC 알고리즘인 **마크 앤 스윕(Mark and Sweep)**은 다음과 같이 동작한다.

  1. 마크(Mark): GC가 모든 객체를 스캔하여, 사용 중인 객체와 사용되지 않는 객체를 식별한다.

  2. 스윕(Sweep): 사용되지 않는 것으로 식별된 객체들을 메모리에서 제거한다.

이 과정에서 GC는 프로그램의 스레드들을 잠시 멈추게 하는데, 이를 **‘Stop-the-world’**라고 한다. 이 순간에는 모든 애플리케이션의 동작이 멈추기 때문에 GC가 너무 자주 발생하거나 시간이 오래 걸리면 프로그램 성능에 악영향을 줄 수 있다. 이 때문에 자바는 다양한 GC 알고리즘을 제공하여 개발자가 애플리케이션의 특성에 맞게 선택할 수 있도록 한다.

객체 지향 프로그래밍 (OOP)의 네 가지 기둥

자바의 정체성은 **객체 지향 프로그래밍(Object-Oriented Programming, OOP)**에 있다. OOP는 현실 세계의 사물과 개념을 ‘객체’라는 단위로 모델링하여 프로그램을 설계하는 방법론이다. 이는 복잡한 시스템을 더 직관적이고 효율적으로 개발할 수 있게 해준다.

OOP의 네 가지 핵심 특징은 다음과 같다.

  1. 추상화 (Abstraction): 불필요한 세부 사항을 숨기고, 핵심적인 기능에만 집중하여 개념을 모델링하는 원리다. 예를 들어, 자동차를 객체로 모델링할 때, 엔진의 복잡한 내부 구조를 숨기고 운전자가 사용하는 ‘핸들 돌리기’, ‘가속 페달 밟기’와 같은 기능만을 노출하는 것과 같다. 이로써 사용자는 복잡한 내부 동작을 몰라도 쉽게 자동차를 제어할 수 있다.

  2. 캡슐화 (Encapsulation): 데이터(변수)와 그 데이터를 다루는 기능(메소드)을 하나의 객체로 묶고, 외부에서 객체 내부의 데이터에 직접 접근하는 것을 막는 원리다.

encapsulation diagram 이미지

라이선스 제공자: Google

이를 통해 객체 내부의 데이터가 외부의 오용으로부터 보호되며, 객체의 독립성을 높인다. 정보 은닉(Information Hiding)을 통해 결합도를 낮추고 응집도를 높여 코드의 안정성을 확보하는 것이 캡슐화의 핵심 목적이다.

  1. 상속 (Inheritance): 부모 클래스의 속성과 기능을 자식 클래스가 물려받아 재사용하고 확장하는 원리다. 예를 들어 ‘동물’이라는 부모 클래스가 ‘먹기’, ‘잠자기’ 같은 공통된 기능을 가지고 있다면, ‘강아지’나 ‘고양이’ 같은 자식 클래스는 이 기능을 따로 구현할 필요 없이 상속받아 사용할 수 있다. 이는 코드 중복을 줄이고 유지보수성을 향상시킨다.

  2. 다형성 (Polymorphism): 하나의 객체가 여러 형태를 가질 수 있는 원리다. ‘같은 이름의 메소드가 다른 동작을 하는 것’으로 이해할 수 있다. 예를 들어, print()라는 이름의 메소드가 정수, 문자열, 객체 등 입력받는 데이터 타입에 따라 다른 동작을 하도록 정의하는 것이다. 이를 통해 코드가 더 유연해지고 확장성이 높아진다.

추상 클래스와 인터페이스의 결정적 차이

자바의 중요한 개념 중 하나인 추상 클래스와 인터페이스는 종종 혼동되지만, 근본적인 목적에서 큰 차이를 갖는다. 이 둘을 명확하게 구분하는 것이 고급 자바 프로그래밍의 시작이다.

구분추상 클래스인터페이스
정의abstract 키워드로 정의. 추상 메소드를 1개 이상 포함할 수 있다.interface 키워드로 정의. 모든 메소드가 추상 메소드(Java 8 이후부터는 예외 있음).
상속/구현extends 키워드로 상속받는다.implements 키워드로 구현한다.
다중 상속불가능가능 (다중 구현)
목적재사용과 확장을 목적으로 한다. 공통된 기능을 물려주고, 미완성된 부분을 자식 클래스가 완성하도록 강제한다. 부모-자식 관계의 상속 개념에 가깝다.규격 및 행동 보장을 목적으로 한다. 인터페이스를 구현하는 모든 클래스는 인터페이스에 정의된 메소드를 반드시 구현해야 한다는 ‘계약’을 의미한다.

핵심 차이점 비유:

  • 추상 클래스: 마치 부모와 자식 관계처럼 ‘나는 ~이니까 너도 ~이어야 해’라는 관계다. 예를 들어 ‘탈것’이라는 추상 클래스는 ‘바퀴 수’라는 속성을 정의하고 ‘이동하기’라는 추상 메소드를 가진다. ‘자동차’와 ‘자전거’는 이를 상속받아 ‘이동하기’ 메소드를 각자 다르게 구현하지만, 공통적으로 ‘탈것’이라는 범주에 속한다.

  • 인터페이스: ‘나는 ~을 할 수 있는 능력을 보장해’라는 계약 관계다. 예를 들어 ‘Flyable’이라는 인터페이스는 ‘날기(fly)’ 메소드를 정의한다. ‘비행기’와 ‘새’는 서로 다른 객체지만, ‘Flyable’ 인터페이스를 구현함으로써 ‘날 수 있다’는 공통적인 기능을 보장한다.

추상 클래스는 상속을 통한 계층적 관계를 표현하는 데 적합하고, 인터페이스는 상속 관계와 무관하게 객체들의 공통된 기능을 정의하고 보장하는 데 유용하다. 자바 개발자는 이 두 개념의 본질적인 차이를 이해하고 적절하게 활용하는 것이 중요하다.

1. 📜 자바 탄생 배경

  • 다양한 OS 환경에서 ==동일한 코드 실행==의 필요성 대두
  • ==자바 가상 머신(JVM)==: OS 위에 추상화 계층 제공

1.1. JVM의 역할

  • OS별 코드 차이 극복
  • 개발자는 OS에 독립적인 코드 작성 가능

1.2. 자바의 인기 요인

  • 운영체제에 따른 ==코드 호환성 문제 해결==
  • 개발 생산성 향상

2. ⚙️ 자바 애플리케이션 실행 과정

  • ==**.java** 소스 코드 작성==
  • ==컴파일러==를 통해 ==**.class** 바이트 코드로 변환==
  • ==JVM==에서 바이트 코드 실행

2.1. JVM 내부 구조

flowchart LR
A["소스 코드 (.java)"] --> B("컴파일러")
B --> C["바이트 코드 (.class)"]
C --> D("JVM")
D --> E["클래스 로더"]
E --> F["런타임 데이터 영역 (메모리)"]
F --> G("실행 엔진")

  • ==클래스 로더==: 바이트 코드를 런타임 데이터 영역으로 로드
  • ==실행 엔진==: 로드된 바이트 코드를 실행

2.2. 바이트 코드란?

  • JVM에서 실행 가능한 형태의 코드
  • ==0과 1로 구성된 기계어==와는 다름

3. 💾 자바 메모리 구조

  • JVM 메모리 영역은 크게 5가지로 구분
    • ==PC 레지스터==: 현재 실행 중인 명령어 주소 저장
    • ==JVM 스택==: 메소드 호출 정보, 매개변수, 지역변수 등 저장
    • ==네이티브 메소드 스택==: 자바 외 언어(C, C++)로 작성된 코드 실행
    • ==힙(Heap)==: 객체 인스턴스 동적 할당
    • ==메소드 영역==: 클래스 정보, 전역 변수, 정적 변수 등 저장

3.1. 스레드 별 영역 vs. 공유 영역

  • 스레드 별 영역: PC 레지스터, JVM 스택, 네이티브 메소드 스택
  • 공유 영역: 힙, 메소드 영역

3.2. 메모리 관리 중요성

  • 효율적인 메모리 사용은 ==애플리케이션 성능==에 중요

4. 🗑️ 가비지 컬렉션 (Garbage Collection)

  • ==JVM==이 자동으로 수행하는 메모리 관리 기법
  • 더 이상 참조되지 않는 객체를 메모리에서 제거

4.1. 가비지 컬렉션 동작 원리

  1. 메모리 부족 시 가비지 컬렉터 실행
  2. ==Mark & Sweep==: 참조되지 않는 객체 식별 및 제거

4.2. 가비지 컬렉션의 장단점

  • 장점: 개발자의 ==메모리 관리 부담 감소==
  • 단점: 가비지 컬렉션 실행 중 ==애플리케이션 일시 중단==, 성능 저하 가능성

5. 💡 객체 지향 프로그래밍 (OOP)

  • ==현실 세계의 사물==을 객체로 모델링하여 프로그래밍
  • 객체의 **속성(필드)**과 ==행동(메소드) 정의==

5.1. OOP의 4가지 특징

  1. ==추상화 (Abstraction)==: 공통 속성을 묶어 상위 개념 정의
  2. ==캡슐화 (Encapsulation)==: 정보 은닉 및 데이터 보호
  3. ==상속성 (Inheritance)==: 기존 클래스의 속성 및 기능 재사용
  4. ==다형성 (Polymorphism)==: 하나의 인터페이스로 다양한 객체 처리

5.2. OOP의 장점

  • 코드 재사용성 증가, 유지보수 용이

6. 🎭 추상 클래스 vs. 인터페이스

  • 둘 다 ==추상적인 개념==을 정의하는 데 사용

6.1. 추상 클래스 (Abstract Class)

  • ==abstract 키워드로 정의==
  • 추상 메소드 (구현이 없는 메소드) 포함 가능
  • ==상속==을 통해 기능 확장

6.2. 인터페이스 (Interface)

  • ==interface 키워드로 정의==
  • 모든 메소드는 기본적으로 추상 메소드
  • **구현(implements)**을 통해 기능 구현
  • 자바 8 이후 ==default 메소드 추가로 구현 가능==

6.3. 핵심 차이점

  • 추상 클래스: ==상속==을 위한 설계
  • 인터페이스: ==구현==을 강제하고, 객체의 ==동작 보장==을 위한 설계

대본

[음악] 4 안녕하세요 장구 입니다 근데 오늘은 잡아 한번 시작해 볼게요 원래는 잡아 하기 전에 디자인 패턴을 먼저 하려고 했어요 근데 생각해보니까 디자인 패턴은 그 객체지향 개념이 많이 들었거든요 그럴 여기는 자 발 먼저 하는게 좋을것 같아서 이렇게 찌 그 디자인의 등 좀 뒤로 뺐어요 네 그럼 잡아 먼저 진행해 볼게요 4 자바 우선은 자바가 왜 이렇게 유명해 졌는지 를 먼저 설명드릴께요 자바는 자바 있기 이전에는 어떤 일이 있었냐 며 뇨 우리가 이제 os 위에 붙어 프로그램이 들어가잖아요 그래서 여기는 맥 os 를 사용하고 있는 윈도우를 사용할 때 이제 각 까 이 윈도 b 운영체제가 다르니까 그 코 등 하는게 달랐어요 같은 언어에도 그래서 이 코드를 다르게 있어야 됐어요 이거 에 맞춰서 임 운영체제에 맞춰서 그러면 지금 같은 프로그램을 구현하려고 하는데 지금 여기도 따로 짜 줘야 되고 여기도 따로 짜 줘야 되는 일이 발생하는 거에요 그러면 이 이게 얼마나 번거롭게 써요 그래서 자마가 나오는데요 자바는 뭐냐면 이런 똑같이 이제 맥이 난 이런 윈도우 운영체제에 있을 때 미리 여기에서 자바가 미리 여기를 미리 짜 넣는 거에요 이렇게 미리 이렇게 짜 놓은 다음에 우리는 그 위에다가 여기에다 짜면 은 이게 호환이 되는 거에요 그러니까 이 자바에서 미리 다르게 짠 없고 이건 공통 된것을 읽을 수 있게 짜 넣었기 때문에 지금 이제 더이상 개발자들이 이 운영체제 밀로 다른걸 짤 필요 없어진 거죠 그래서 이게 자바의 핵심이고 이것 때문에 자가 되게 유명해지게 된 거죠 이렇게 잡아 역사를 잠깐 봤는데요 이때 이렇게 임 운영체제 바로 위해서 우리가 짠 소스 코드를 돌리게 해 준 녀석들이 제 2의 의 의미라고 해요 자바 버추얼 멋이 4 아니 들어보셨죠 그리고 여기에서 우리가 쌍 에게 이제 소스 코드가 재위 의해서 돌아가는 거구요 때 그래서 우리가 뭘 하 죠 2 소스 코드를 이제 컴파일을 나죠 컴파일을 해서 이 재위 행위로 돌아가게 만드는 거죠 4 이렇게 간단하게 재미 애매해서 살펴 봤고요 그러면 이제 자바에 어플리케이션이 어떻게 실행은 변질을 볼게요 우선은 우리가 이제 잡아라 를 읽으며 짜 잖아요 뭐 해 보셨죠 발로 원래 뭐 이런식으로 뭐 어떻게 했잖아요 그럼 이게 쫄 잡아 확장자로 이제 저장을 해 줘 이걸 어떻게 어 콘 타이라 줘 컴파일하면 은 뭘 먼로 자도 되죠 그러면 점 클래스 파일로 저장 거죠 그렇게 그럴 컴파일을 한 번 한 다음에 이거를 이제 어떻게 실행 하는지를 볼게요 그래서 자바의 구조를 간단하게 한 보면요 자바는 이렇게 나오겠어요 이렇게 생겼어요 그래서 아까 설명했던 jbm 2 여기에 있고요 우리가 소스코드를 이렇게 짤 거예요 소스 코드가 이 컴파일러를 통해서 이제 클래스 파일을 맡기는데 요게 바이트 코드의 어 이름에서 조심해야 듣게 발 드 코드라고 전지 영웅인 00 이념 뭐 이런걸 것 같잖아요 이런게 아니구요 2바이트 코드 란 것은 하나의 2등 예 였구요 jbm 에서 두라 가게 만들어진 코드 그래서 이 jbm 읽게 되는 거죠 자 그럼 jvm 에서 언제 어떤 일이 일어나면 요 제비의 만에 클래스 로더 라는 것이 있어요 클래스 온다 아빠도 이제 클래스들을 이제 불러오는 것 같죠 그래서 이자 파이트 코드를 불러와서 2 자바에 메모리 여기에 왜 모르거든요 메모리의 이제 우리는 넣어요 보면은 런타임 데이터 영역 이라고 사용된 여기가 자바의 메모리 에요 그러면 이제 여기는 실행 웅진 이거든요 실행 엔진에서 이제 이것들을 실행을 하는 거죠 자 그러면 정리를 하면 요 이제 뭐 면접관이 잡아 어떻게 실행해야 하는지를 여부로 보면은 전 이렇게 대답했어요 4 우선은 첫번째로 컴파일러와 자바 소스를 발트 코드로 변환합니다 그 다음의 클래스 로더가 발트 코더 를 런타임 데이터 응대를 로드 시키고 요 그걸로 든든 로딩된 바이트 코드를 실행 엔진 에 의해서 실행되게 됩니다 라고 말하겠어요 네 그러면 다음 넘어 갈게요 자 그러면 다음은 이제 자바 메모리 구조 해요 4 자바 에는 어 기존의 우리 에어 서쪽 그 운영 철 시간에 코드 데이터 데이터 그 다음에 힙 스탠이 있었죠 근데 이거는 어 그런 운영체제에서 프로그램들이 어떻게 나누어진 야 이게 됐구요 여기에 이제 우리 jvm 이 치른 배는 거에요 그 운영체제 메모리에 jb 올라가요 그 jbm 않은 또 외모 리 영역이 나누어진 거에요 또 메모리 내용이 아까 봤던 것처럼 런타임 데이터 이어 여기 이렇게 있어요 그럼 이 거뜬히 지금 어떻게 나누어 지금 지를 설명하려고 하는 거예요 4 자막 메모 있는 크게 5가지 정도가 있는데요 우선은 이제 쓰레드 별로 스레드는 전에 운영체제 시간에 말 쪄 세드 별로 pc 레지스터 제비 에스텔 메이킹에 소스 태 흘리고 쓰레드 공통으로 메쏘드 아래 아래아 훨씬 영향이 있어요 장미 것들을 간단하게 그림을 볼게요 예 보면은 이렇게 5개 영역으로 나눠져 있는데요 지금 잡으며 는 식과 매스 0 요기가 쓰레드 공통 사용되는 부분이 있고요 여기가 쓰레드 별로 사람들은 부분이에요 자금 1c 살펴볼게요 2 pc 레지스터는 어 현재 현재 지금 승 중에 명령어를 가지고 있어요 제비 한 명령어 2바이트 코드 에서 가져온 명령어들이 겠죠 그 다음에 이 스택 영역 은 스택 양옆 은 어떤 것이 들어갈까요 우리 그 기존의 운영체제에서 데이터 구조 살펴 봤으면 스택은 뭐였죠 부터 함수에 대한 정보들이 들어왔죠 그래서 함수에 대한 정보가 여기 도 마찬가지고 있도록 그래서 메소드의 에 함수의 매개 변수 지역변수 오블리 턴 정보들이 저장되게 되요 다 그 다음에 네이티브 메쏘드 스템 00 이라는게 있는데요 자 지금 자바는 제빙 에서 작동이 된다고 하잖아요 그래서 제 2의 잡아내 무에서 이렇게 코드를 실행시키기 위해서 예를 들면 은 뭐 시스템 젊 아우 점 뭐 프린터를 한다 고쳐 볼게요 여기 드가 전부 자바 소스로 말 이루어져 있지 않아요 뭐 c 언어에서도 메소드가 꿔서 사용을 하고 또 실 플러스 사서 사용하고 이런식으로 구성되어 있거든요 그래서 4인 팀의 소스 태그 어 잡아 외무부 언어 그러니까 잡아 외에 다른 언어로 어 작성된 그 코드들이 들어가 있어요 자 그 다음에 4 10 영역은 뭐였죠 힙 용역을 지가 운영체제에서 메모리 구조와 비슷하게 힘들어 하는거 예 사용자가 사용하면서 생긴 데이터가 저장 등 공간이에요 이렇게 이름을 뭐라고 했죠 삶은 데이터가 정적으로 할당된 다 고 말하죠 자 그래서 힙을 이제 데이터가 동쪽으로 할당된 보시고요 런타임 중에 를 메쏘드 영역은 뭐냐면 이가 클래스별로 전역변수 했을 때 고 정적 변수의 스택 우 그룹의 쏘듯 을 정보들이 숫자 나요 그것들이 저장된 공간이에요 자기의 가지 더 이렇게 그래서 자바는 다섯 개의 메모리 영역으로 나누어 지게 되요 자 그럼 정리 한번 해볼게요 면접관이 혹시 자바 메모리 구조가 어떻게 되어 있나요 라고 물어보면 저는 이렇게 대답하세요 4 자바 메모리 구조는 크게 5가지가 녀 9분 되는데요 우선 쓰레드 마다 pc 레지스터 제 비행 스펙 로워 매입 네이티브 메쏘드 선택했구요 그리고 쓰레 공통으로 는 힙과 메쏘드 인연이 있습니다 opc 레지스터는 현대 쎈 중절 비너 녀와 들어가 있구요 그제 빔 스탠은 호출된 메소드의 맺으면 수 지역변수 러블리 턴 정보들을 제공 네이티브 메쏘드 스택은 잡아 왜에 언어인 c 날 10 플러스 플러스 같은 것들을 수행하기 위한 연인 이구요 를 메쏘드 영역은 클래스별로 전역변수 정적 * 숍으로 메쏘드 정보들이 저랑 되게 됩니다 마지막으로 힘이 영역에서는 이제 런타임 중에 생성되는 그런 객체들이 동적으로 할당되는 것입니다 라고 겸용 하겠어요 4 그럼 다음은 놀러가면 넘어가면 요 가비지 컬렉션 이에요 가비지 컬렉션은 서 이제 자마 에서 자바 가 사용된 것이 재미 잊어 재미 면서 메모리를 벌려주는 분들이에요 자 메모리를 관리해 주는게 뭐냐 라고 물어보실 수도 있어요 그러니까 이게 억 예전에는 개발자 같죠 메모리 관리 해줄 수가 있어요 어떤 말이냐면 은 우리가 꽃들을 짜요 a 는 뭐 이리 꽃피는 이에요 이런식으로 쭉 짜요 그럼 이제 코드가 계속 실행될 때 메모리에서 어떻겠니 라고 하면 이렇게 계속 2일 저장되고 이 저장되고 3 저장되고 추측해 쭉 계속 저장을 해야겠죠 그럼 이렇게 만약에 이정 들이 계속 쓰이지 않는다면 은 이것들이 계속 자리만 차지 한 채 메모리가 낭비되고 있겠죠 그래서 예전에는 이제 뭐 딜리트 에이 뭐 이런식으로 해서 이제 이런 식으로 메모리를 이제 비워져 있는 작업들을 했었어요 근데 자바에서는 이런 것들을 jvm 에서 자동으로 해줘요 그 이름이 뭐냐 가비지 컬렉션이 예요 자 그럼 어떤 원리로 크게 착 똥이 되냐면 요 5 이렇게 프로 소스코드가 실행이 되다가 메모리가 점점 꽉 찼어요 그러면 잠깐 멈춰요 시대 마더 그래 잠깐 멈춰 멈춘 다음에 이것들이 어디에서 참조 되고 있는지를 확인해 가까이 그래서 창조되고 또는 참조 되고 있지 가 않아 그럼 이거는 없애버릴 지워 버려요 그러면은 이제 여기는 메모 이제 메모리가 에 빈공간에 생기는 거죠 이런식으로 찍어 버릴 이렇게 어 잠깐 멈춘 다음에 어안 쓰고 있는걸 찾는 과정을 보라고 하면 아 그 엔드 스윔 이라고 해요 이래서 이런 시 이런 방식으로 가비지 컬렉션이 일어나 여 자 합 2% 이상 쪄서 짓이라고 되요 그래서 쥐 씨가 뭐야 뭐예요 면접관이 주 시간 뭐예요 라고 그러면 저는 이렇게 말했어요 지씨는 갑이 jvm 에서 메모리를 관리해주는 모듈입니다 힙 메모리를 재활용 하기 위해서 더 이상 참조 되지 않는 객체들을 메모리에서 제거하는 모습입니다 그래서 개발자가 직접 메모리를 정리하지 않아도 되어서 개발에서 또 향상되는 장점이 있지만 이 마크 n 스윕 일하는 과정에서 어 참조 되지 않는 객체를 찾는 과정이 있는데 이때 쓰레드가 잠깐 중단 되어서 성능이 떨어진다는 단점이 있습니다 라고 되는가 겠어요 자 그러면 다음 넘어가 께 어 자 다음은 이제 괜찮아 지향 프로그래밍에 대해 설명해 줄게요 해드릴께요 개체 지향 프로그래밍은 사실 개념이 좀 어려워요 그리고 이걸 한 장으로 설명 한다는 것 자체가 굉장히 어려워요 근데 이제 하라고 하다 보고 공부하다 보면 이게 무슨 느낌인지 어떤 개념 엔진의 알게 되는데 이게 한번 의 이야기는 굉장히 그래서 제가 아마 말을 해도 아마 e 까지 안됐을 거예요 그리고 따로 공부를 해도 자기 이해가 안 되실 거에요 그 래도 공부를 계속 하다보면 어느순간 이해가 되실 거에요 객체지향 에 대해서 근데 중요한 건 은 내가 면접관 안될 되다 이제 대답을 할 때는 면접관은 이미 알고 있는 사람이잖아요 이 객 7장 프로그램이 먼지 그렇기 때문에 내가 이런 어간 완전히 설명되는 용어를 얘기하지 않아도 내가 최선 에서 설명할 수 있는 용을 얘기하면 은 면접관은 무슨 얘기인지 알아 들 거에요 그래서 지체가 바르고 싶은 거는 지금 당장 얘기가 안 되도 계속 공부하면서 그 아마네 언어로 그런 정리할 수 있는 달러를 문장을 만들어라 얘기해요 그래서 객지 시간 프로그램을 한 원장을 설명하며 는 현실이 세계의 사물 이런 뭐 키보드 마우스 이런 사물 같은 객체를 만들고 그 객체 필요한 특징들을 뽑아요 뭐 필드 뭐 뭐 매기면 수 아니면은 에잇 일드 rms 도 이런식 열려서 키보드가 노크 단추 뭐 버튼이 눌린 다 이런식으로 이렇게 행도 라는걸 동 매 솟 으로 표현 하고요 그리고 가까 어떤 사업회 어떤 사업화 있는지를 그 변수로 되었네요 이렇게 특징을 뽑아서 수 로 그 래 밍 쉬라는 거에요 자 그래서 객체지향 프로그래밍은 총 4가지의 특징이 있어요 이것도 외워 주셔야 되요 자 이거는 어그 전부 처리 있어 따지는 분들은 다 아실 거에요 추상성 그리고 캡슐화 그리고 상 속성 그리고 다양성이 자 추상성 는 뭐냐면 수상하는 뭐냐면 어 하나의 그 사물들이 있는데 이거를 공통적인 특징 뽑아서 하나의 개념 놈 자 부순 말이냐면 은 자 올라가 있구요 물이 있어요 자 그럼 이거는 어떤 공통점이 있죠 이건 어떤 공통점이 왜냐면 마시는거 라는 공통점이 있어요 그래서 이렇게 추상으로 라는 것은 하나의 특징을 하나의 개념을 뽑아내는 것을 어 죄송해요 자 다음 캡슐화 는 캡슐 않은 이제 각각의 개체들 있잖아요 그런 객체들 암에 내부의 승리라는 정보들은 숨기고 그리고 공개된 정보를 공개하고 그리고 이렇게 이 안에 있는 것들이 즉 서로 이제 잘 연결이 되도록 한 다음에 외부 랑은 이제 연결해서 안 되도록 하는게 캡슐 해요 하나의 캡슐로 만든다는 거죠 외부와 연결이 많이 되면 안 좋아요 2월 을 결합도 라고 표현하는데요 별아 비만이 되면 안 좋아요 왜냐하면 은 이게 없으면 더 이상 사용할 수 없거든요 이걸 그렇기 때문에 외부에는 많이 의 좀 하지 않는게 외부와 많이 결합하지 않는게 조금 잘 이제 코드가 작성된 거에요 그래서 캡슐 라는 뭐냐면 음 정보 은닉 을 통해서 어 상 높은 음식도 그러니까 높은 음식 내부적으로 높은 지도를 가지고 외부의 사오는 낮은 결합도 를 갖도록 하는 걸 캡슐 하라구요 다음은 상 속성 볼게요 상 속성은 자 우리가 a 라는 클래스를 짰어요 a 라는 클래스 에서 1번과 2번을 수행한 덮쳐 볼게요 근데 p 는 a 와 기능이 굉장히 비슷해요 근데 1번과 2번을 똑같이 수행을 한 다음에 그 다음에 3번을 수행을 해 이런 클래스가 있다 고쳐 볼게요 자 그러면은 만약에 지금 1번과 2번이 똑같은게 2번 작성도 있죠 이게 아니라 중 계묘 괜찮은데 100개 1000개 라면 그리고 1000개 란 문제가 되겠죠 이걸 다 작성을 해야 되니까 그 작성하는 게 첫 번째 문제구요 이게 만약에 수정이 되었어요 수정을 여기가 a 라고 수정이 되었어요 그럼 여기도 a 라고 수정이 되어야 되죠 극단 데도 애니라고 마다 수정이 될 거야 이 자금도 번꼴로 구여 여기서 만약에 a 라고 하는 모르고 삐 로 했어요 실수 록 흐름 또 버그가 발생하는 거에요 그래서 이런 것들은 상속을 통해서 이 하나를 객 그대로 사용할 수 있게 그래서 삐 안에 a 를 넣어서 그대로 위의 것을 그대로 재사용할 수 있게 하는게 상 속성 이에요 다음은 다형성 이에요 자 다형성을 설명하려면 다 영성은 어떤 우리가 데이터를 담는 리스트가 있다 고쳐 볼게요 리스트의 어 문자도 다음 문자를 담으려고 2 점프 c 라는 메소드를 추가했어요 바구니에 라고 다보니 의 수시 라는 메소드를 추가할 저기에 눈 짜 라는 메소드를 정애를 했어요 근데 어 바 문자 아니고 이제 이번엔 숫자를 넣으려고 요 그래서 똑같이 밥은 이에 푸쉬 라고 하고 여기에 숫자를 넣으면 은 이제 정리가 안되요 왜냐하면 은 이미 같은 이름의 있잖아요 그렇기 때문에 여기에다가 푸쉬 숫자 라고 넣으면 은 넣으면 착 똥이 되겟죠 그렇게 착 똥을 한다 치면 여기에다가 뭐 불림 값을 넣거나 뭐 다른 데이터 타입을 넣을 때 각각 메소드를 다 정의를 해 줘야 하잖아요 이 작업이 너무 복잡한거 그래서 모두 후 c 라는 이름을 갖고 이 안에 문자 숫자 불린 그 외의 다른 객체 야구할 때 를 각각 정의를 다르게 하는 거죠 그렇게 하면은 이쿠 씨라는 요청이 와도 갖다대 데이터 그 안에 들어간 베이터 에 따라서 다른 방식으로 동작을 하게 하는게 다형성 이에요 잘해서 추상화 캡슐화 상속 쌍 다양성에 대해서 한번씩 살펴 봤구요 그래서 만약에 면접관이 객체지향 프로그래밍 뭘까요 라고 얘기하면 은정 이렇게 있겠어요 자 현실 세계의 삶으로 같은 객체를 만들고 그 객체가 필요한 특징을 뽑아서 프로그래밍을 써야 하는 것입니다 개체 제한 프로그램 총 배 가지 특징 있는데요 추사와 캡 c 라 생 숙성 다양성 입니다 그래 추상화 캡슐 혹성 다양성을 이제 설명을 해주면 되겠죠 4 그러면 다음에 이제 추상 클래스와 인터페이스의 더머 가도록 할게요 4 추상 클래스와 인터페이스는 2개째 재앙 스택에 중요한 개념이 있고 자주 물어 봐요 그래서 이거는 꼭 알고 계셔야 되요 자 추상 클래스 는 이제 stl 크지 시작으로 종이가 되구요 내 안의 추상 메소드가 하나 이상 포함된 인터페이스는 인터페이스 지 잘 정리되고 모든 메소드가 추상 메소드를 정의 되요 근데 이게 잡아 8 이웃 5 자바 ad 5부터 여기서도 메소드를 정의할 수 있게 됐어요 기원할 수 있게 됐고요 5 점점이 경계가 모호해 져요 그래서 그래서 이 차이를 알고 있나 더 울어 보인 물어보는 거 같아요 자 추상 클래스 와 인터페이스는 그 두 개의 목적의 찰리스 그 폰 본질을 할래 본질이 자 추상 클래스는 뭘 위 하고 나면 상속을 위하고 거구요 인터페이스는 도장 논을 위한 거에요 자 무슨 말이냐면 내 않은 추상 클래스를 추상 클래스를 통해서 상속을 받아서 그 부모 클래스 어 자식 클래스 이런식으로 산속을 받아서 잎은 5 플래시에 기능을 재활용 하기 위해서 사용하는 것이 추상클래스 있어요 작은애 인터페이스는 뭐냐면 인터페이스를 첫번째 2인분 rc 겠지만 인터페이스를 구현하며 는 그다 같은거 메소드를 구현을 해야 되죠 그 메소드가 추상 해서 되기 때문에 그 같은 이름의 메소드를 모두 고견을 해야 된단 말이요 그래서 인터페이스는 뭐냐면 이 인터페이스를 지원한 객체들은 모두 같은 동작을 할 수 있다 라는 것을 보장하기 위해서 한 사용한 게 인터페이스의 어요 4 정리하자면 추상 파 4 에서는 이 부모 클래스 의 기능을 재사용하기 위해서 상속을 하기 위해서 사용하고 인터페이스는 2인 위 부모 인터페이스의 기능을 9 사용한다는 것을 기능이 있다는 것을 보장하기 위해서 사용을 해요 자 그래 정리를 하다 며 면접관이 억 추상 클래스와 인터페이스의 차이 앱에 대해서 물어보면 은 자축 안 클래스 는 엑스트라 text 라크 지시자를 정해져서 수상 메서드가 1 이건 포함해 는 어 그 클래스 구요 인터페이스 는 인터페이스 지시자 요정 의 되어서 모든 메소드가 추상 없어도 정해 되게 됩니다 추상 클래스와 인터페이스의 차이는 그 정제 목적의 있습니다 전 t 자 클래스 는 상속받아서 기능을 재활용하고 확장시키는 데 그 목적이 있다고 하면은 인터페이스 는 이제 함수의 기능을 함수의 뒤 오늘 가 문제에서 그 객체들이 지난 객체들이 같은 동작을 하는 것을 보장하는 것에 그 목적이 있습니다 라고 대답을 하겠어요 자 이렇게 자바를 어 한번 쭉 살펴 봤어요 어때요 자바가 조금 어려워요 자 밤과 오려 무엇보다 이 객체지향 개념 이 들어가면 되기 어려워 줘 그래도 객지 장님은 100m 연 저서 자주 나오니까 또 공부를 해 주실 그리고 이후에 이걸 알아야 이후에 이제 기장 패턴이나 다른 것들로 공복에 쉬워져요 네 그럼 오늘은 여기까지 할게요 안뇽