아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고자료

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

# 접근 제어자(Access Modifier)

접근 제어자는 클래스, 메서드 및 기타 멤버의 액세스 가능성을 설정하는 객체 지향 언어의 키워드입니다. 

구성 요소를 캡슐화 하는 데 사용되는 프로그래밍 언어 구문의 특정 부분입니다.

 

 

자바에는 다음과 같은 접근 제어자가 있습니다.

  • private
  • default
  • protected
  • public

 

 private ▶ default ▶ protected ▶ public 순으로 보다 많은 접근을 허용합니다.

 

반응형

 

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고자료

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

 

# 캡슐화(Encapsulation)란?

  • 데이터 + 관련 기능 묶기
  • 연관된 "상태"와 "행위"를 결정하는 기능을 묶어 주는 것을 의미합니다.
    => 이렇게 묶어 주면 기능을 클래스 밖에서 접근 가능한 대상을 제한하는 정보 은닉이 가능하다.
    => 하나의 객체를 위한 코드가, 다른 객체를 위한 코드와 무관하게 수행할 수 있는 모듈화(modularity)가 가능해진다.
  • 객체가 기능을 어떻게 구현했는지 외부에 감추는 것
    -> 구현에 사용된 데이터의 상세 내용을 외부에 감춘다.
public class Common {
	private int state;  // private로 선언함으로써 정보 은닉
    public void setState(int newState) { // 상태를 변경 가능
    }
}

 

 

 캡슐화를 하는 이유

  • 외부에 영향 없이 객체 내부 구현 변경 가능
  • 요구사항의 변화가 발생 했을 때, 연쇄적으로 변경이 전파 되는 걸 최소화 할 수 있다.
    -> 캡슐화된 기능을 사용하는 코드에 변경에 따른 영향을 최소화 할 수 있는 이점
    -> 캡슐화를 사용하는 가장 큰 이유
  • 캡슐화 시도는 기능에 대한 (의도) 이해를 높임
    * 작성된 코드의 의도를 파악해야 캡슐화를 할 수 있다.

 

 

# 캡슐화를 위한 규칙

 

  • Tell, Don't Ask
    -> 데이터 달라 하지 말고 해달라고 하기

 

왼쪽 코드처럼 acc.getMembership()으로 데이터를 가져와 해당 데이터가 REGULAR인지 확인 하는 것이 아닌,

오른쪽 코드처럼 확인(판단)을 해달라고 지시 하는 것이다. 

 

 

Demeter's Law

  • 메서드에서 생성한 객체의 메서드만 호출
  • 파라미터로 받은 객체의 메서드만 호출
  • 필드로 참조하는 객체의 메서드만 호출

 

오른쪽 코드처럼 acc에 특정 메서드만 호출하는 방식을 사용하는 법칙이다.

* 메서드 하나만 호출하는 방식

 

좀 더 간결하고 기능과 의도 파악이 쉬워진다.

반응형

🎯 공부 목표

  • 자바 소스파일(.java)을 JVM으로 실행하는 과정 이해하기

 

학습할 것

  • JVM이란 무엇인가
  • 컴파일 및 실행 하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

1️⃣ JVM이란 무엇인가

 

🔗 참고자료

 

 

 

출처: 부스트코스(쉽게 배우는 자바1)

 

# JVM 이란?

 

자바 가상 머신(Java Virtual Machine)은 자바 바이트코드를 실행, 해석할 수 있는 주체이다.

JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 기본 API를 동적으로 연결해 자바 프로그램을 실행하는 것입니다.

  • 기술적 정의
    -> 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)

  • 일반적 정의
    -> JVM은 자바 프로그램을 실행하는 방법이다. JVM의 설정을 구성한 다음 설정 사항에 따라 실행 중에 프로그램 리소스를 관리한다.

 

* 가상 머신 : 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것.

 

#JVM의 특징

 

  • 스택 기반의 가상 머신
    -> 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로
    동작하는 데 비해 JVM은 스택 기반으로 동작한다.

  • 심볼릭 레퍼런스(Symbolic Reference)
    -> 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의
    레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.

  • 가비지 컬렉션(Garbage collection)
    -> 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다.

  • 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장
    -> C/C++ 등의 전통적인 언어는 플랫폼에 따라 int 형의 크기가 변한다. JVM은 기본 자료형을 명확하게 정의하여
    호환성을 유지하고 플랫폼 독립성을 보장한다.

  • 네트워크 바이트 오더(Network byte order)
    -> 자바 클래스 파일은 네트워크 바이트 오더를 사용한다. 인텔 x86 아키텍처가 사용하는 리틀 엔디안이나,
    RISC 계열 아키텍처가 주로 사용하는 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더를 사용한다.
    네트워크 바이트 오더는 빅 엔디안이다.

  • Class 파일은 JVM이 읽을 수 있는 형태로 번역된 결과물이다.
  • Class 파일은 참조하는 라이브러리를 포함하지 않고 단순히 심볼릭 레퍼런스만을 가진다.

 

 

 

# 자바 바이트 코드(ByteCode)

WORA(Write Once Run Anywhere) 를 구현하기 위해 JVM은 사용자 언어인 자바와 기계어 사이의 중간 언어인 자바 바이트 코드를 사용한다.

이 자바 바이트코드가 자바 코드를 배포하는 가장 작은 단위이다.

 

  • ByteCode는 JVM을 위한 언어이다.

 

 

 

# 심볼릭 레퍼런스란?

심볼릭 레퍼런스는 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아니라 참조하는 대상의 이름만을 지칭한 것이다.

Class 파일이 JVM에 올라가게 되면 심볼릭 레퍼런스는 그 이름에 맞는 객체의 주소를 찾아서 연결하는 작업을 수행한다.

실제 메모리 주소가 아니라 이름만을 가진다.

 

 

 


2️⃣ 컴파일 및 실행 하는 방법

 

 

🔗 참고자료

 

 

 

# 자바로 작성된 코드 실행 전 필수사항

자바로 작성된 코드를 컴파일해서 자바 Bytecode를 생성하기 위해서는 JDK가 필수로 설치되어 있어야 합니다.

 

 

JDK(Java Development Kit)란?

자바 개발 키트로 자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성요소입니다.

이 중심에는 자바 컴파일러(Compiler)가 있습니다.

 

JDK는 JVM, JRE과 함께 자바 프로그래밍에 사용되는 3대 핵심 기술 패키지 가운데 하나입니다.

 

  • JVM : 프로그램을 실행하는 자바 플랫폼 구성요소
  • JRE : JVM을 생성하는 디스크 상의 부분
  • JDK : 개발자들이 JVM과 JRE에 의해 실행되고 구동될 수 있는 자바 프로그램을 생성할 수 있게 해 준다.

 

위 사진을 보면 알 수 있듯이 JDK를 설치하면 JRE, JVM도 설치가 됩니다.

 

 

 

설치 및 환경변수 설정 방법

https://mozi.tistory.com/428

 

[JAVA] OpenJDK 다운로드 및 설치하기 (JDK 다운 및 설치하기, JDK 란, 환경변수 잡는법)

JDK (Java Development Kit) 란 JAVA 언어로 개발 및 빌드하기 위한 '개발 툴킷' 을 의미합니다. JDK 는 JRE 기능을 포함하고 있으며, 자바프로그램이 JVM 에 의해 실행할 수 있도록 해줍니다. JDK 와 OpenJDK..

mozi.tistory.com

 

 

 

# 개발도구 없이 자바 소스코드 컴파일(Window)

 

openJDK를 설치했다면 해당 경로에 보면 bin 디렉터리가 있습니다.

 

* bin  디렉터리에는 자바로 개발하는데 필요한 주요 파일들이 들어있습니다.

 

 

  1. java.exe : 자바 응용 프로그램 로더.
    -> javac 컴파일러가 만든 클래스 파일을 해석 및 실행한다. 현재 하나의 런처가 개발 및 배포에 동일하게 사용된다. 예전에 사용되던 배포용 런처 jre는 더 이상 Sun JDK에서는 제공되지 않고, 이 로더로 대체되었다.
    * 한 줄 정리 => 자바 인터프리터, 바이트코드를 실행한다.
  2. javac.exe : 자바 컴파일러. 자바 소스 파일을 바이트코드로 변환해준다.
  3. javap.exe : 클래스 파일을 자바 소스 코드로 디스어셈블해주는 도구

 

 

# 본격적으로 자바 소스코드 작성 후 컴파일해보기

 

class HelloWorld
{
	public static void main(String[] args) {
		System.out.println("Hello World!!");
	}
}

 

- 우선적으로 해당 소스 코드를 아래와 같이 메모장에 작성합니다.

 

 

 

 

 

- 작성 완료 후 C 드라이브에 HelloWorld라는 폴더를 만듭니다.

 * 폴더 이름을 꼭 HelloWorld로 할 필요는 없습니다. 원하시는 이름으로 만들어주세요.

 

 

 

 

- 폴더를 만들었으면 해당 폴더에 메모장 파일을 .Java 확장자로 저장합니다.

 꼭 .Java 확장자로 저장을 해야 합니다.

 

 

 

 

저장을 완료했으면 cmd 창을 열어 위와 같이 입력합니다.

 

 

  1. cmd창 명령어인 cd(Change Directory) 명령어를 사용해 해당 경로 이동
  2. javac 명령어를 통해 자바 소스 파일을 자바 바이트코드로 변환합니다.
    => .class 파일 생성
  3. javac 컴파일러가 만든 클래스 파일을 java 명령어를 통해 해석 및 실행한다.
    => 위 사진에서 볼 수 있듯이 Hello World 가 출력된 모습을 확인할 수 있습니다.

 


3️⃣ 바이트코드란 무엇인가

 

 

🔗 참고자료

 

 

# 바이트 코드란?

  • 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
  • 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다.
  • 특정 하드웨어에 대한 의존성을 줄이고, 인터프리팅도 쉬운 결과물을 생성하고자 하는 프로그래밍 언어에 의해,
    출력 코드의 한 형태로 사용된다.
  • 컴파일되어 만들어진 바이트코드는 특정 하드웨어의 기계 코드를 만드는 컴파일러의 입력으로 사용되거나, 가상 컴퓨터에서 바로 실행된다.
  • 사람이 읽기 쉽도록 쓰인 소스 코드와 비교하면 바이트 코드는 덜 추상적이며, 더 간결하고, 더 컴퓨터 중심적이다.

 

 

# 자바 바이트 코드란?

자바 컴파일러를 통해 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미합니다.

자바 바이트 코드는 자바 가상 머신(JVM)만 설치되어 있으면, 어떤 운영체제에서라도 실행 될 수  있습니다.

 

  • 자바 바이트코드는 JVM이 실행하는 명령어의 집합
  • 컴파일하면 생성되는 .class 파일이 바이트 코드를 담고 있습니다.
  • OS나 개발환경에 관계없이 명령어 집합을 사용 할 수 있다.
    -> 자바의 크로스 플랫폼 동작 가능

 

# 자바 바이트 코드를 더 깊게 알려주는 사이트

https://iamsang.com/blog/2012/08/19/introduction-to-java-bytecode/

 

이상현 IN 베를린 :: 자바 바이트코드 소개

자바 바이트코드 소개 Understanding bytecode and what bytecode is likely to be generated by a Java compiler helps the Java programmer in the same way that knowledge of assembly helps the C or C++ programmer. - IBM developerWorks journal 개발을

iamsang.com

 

  • 자바 바이트 코드를 공부하는 이유
  • 자바 바이트 코드 명령어
  • 소스 코드가 자바 바이트 코드로 변환된 결과
    -> if와 switch 문의 차이를 자바 바이트 코드로 분석

해당 링크에 위의 내용 외에도 다양한 내용이 담겨 있습니다.

자바 바이트 코드를 더욱 깊게 알아보고 싶으신 분들은 읽어 보시는 걸 추천드립니다.

 


4️⃣ JIT 컴파일러란 무엇이며 어떻게 동작하는지

 

 

🔗 참고자료

 

 

# JIT 컴파일러(Just-In-Time compiler)란?

프로그램이 실행 중인 런타임에 실제 기계어로 변화해 주는 컴파일러를 의미합니다.

동적 변환(Dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었습니다.

즉, JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용합니다.

 

자바 바이트 코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다.

그래서 실행 엔진은 이와 같은 바이트코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경하며, 그 방식은 다음 두 가지가 있다.

 

 

인터프리터

  • 바이트코드 명령어를 하나씩 읽어서 해석하고 실행한다.
  • 하나씩 해석하고 실행하기 때문에 바이트코드 하나하나의 해석은 빠른 대신,
    인터프리팅 결과의 실행은 느리다는 단점을 가지고 있다.
  • 바이트코드라는 '언어'는 기본적으로 인터프리터 방식으로 동작한다.

 

JIT(Just-In-Time) 컴파일러

  • 인터프리터의 단점을 보완하기 위해 도입된 것이 JIT 컴파일러이다.
  • 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고,
    이후에는 해당 메서드를 더 이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식이다.
  • 네이티브 코드를 실행하는 것이 하나씩 인터프리팅하는 것보다 빠르고,
    네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 계속 빠르게 수행되게 된다.

 

 

 

 

 


4️⃣ JVM 구성요소

 

🔗 참고자료

 

 

 

# JVM 구조 및 구성

자바로 작성한 코드는 다음 그림과 같은 과정을 통해 수행된다.

출처: NVER D2

 

클래스 로더(Class Loader)가 컴파일된 자바 바이트코드를 런타임 데이터 영역(Runtime Data Areas)에 로드하고,
실행 엔진(Excution Engine)이 자바 바이트코드를 실행한다.

 

 

  1. Class Loader(클래스 로더)
    - JVM내로 클래스(.class파일)를 로드하고, 링크를 통해 치하는 작업을 수행하는 모듈이다.
    - Runtime 시에 동적으로 클래스를 로드한다.
    - jar파일 내 저장된 클래스들을 JVM위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제한다.
    - (컴파일러 역할) 자바는 동적 코드, 컴파일 타임이 아니라 런타임에 참조한다.
      즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크한다는 것이다.

  2. Execution Engine(실행 엔진)
    - 클래스를 실행시키는 역할이다.
    - 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.
    - 자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다.
    - 실행 엔진은 이와 같은 바이트코드를 실제로 JVM내부에서 기계가 실행할 수 있는 형태로 변경한다.

  3. Interpreter(인터프리터)
    실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
    하지만 이 방식은 인터프리터 언어의 단점을 그대로 갖고 있다. 한 줄씩 수행하기 때문에 느리다는 것이다.

  4. JIT(Just - In - Time)
    - 인터프리터 방식의 단점을 보완하기 위해 도입된 JIT 컴파일러이다.
    - 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고,
    이후에는 해당 더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식이다.
    - 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.
    - JIT컴파일러가 컴파일하는 과정은 바이트코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한번만 실행되는 코드라면 컴파일하지 않고 인터프리팅 하는 것이 유리하다.
    - JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일을 수행한다.

    * 네이티브 코드언매니지드 코드라고도 불립니다. 코드가 바로 Machine Code로 컴파일되고, 컴파일한 Machine과 동일한 칩 등을 사용하는 환경에서만 실행이 가능합니다.(예를 들면 C언어)

 


4️⃣ JDK와 JRE의 차이(자바 기초스터디 1 - 6)

 

🔗 참고자료

 

 

# JRE(Java Runtime Environment) 란?

JVM(자바 가상 머신), 자바 클래스 라이브러리(Java class library), 자바 명령(Java command) 및 기타 인프라를

포함한 컴파일된 자바 프로그램을 실행하는데 필요한 패키지이다.

 

  • 자바 애플리케이션을 생성하고 실행하기 위한 일련의 구성 요소입니다.
  • JDK(Java Development Kit)의 일부입니다.
  • JVM, 자바 클래스 라이브러리, 자바 클래스 로더로 구성됩니다.

 

JRE의 용도

  • 자바 소프트웨어 개발에 사용되고, 프로그래밍 툴 및 배포 기술을 제공합니다.
  • JRE는 JDK를 사용하여 작성된 자바 코드를 JVM에서 이의 실행에 필요한 필수 라이브러리와 결합한 후
    결과 프로그램을 실행하는  JVM의 인스턴스를 작성합니다.
  • JVM은 다수의 운영체제에 사용 가능하며, JRE를 사용하여 작성된 프로그램이 모든 운영체제에서 실행됩니다.

 

 

 

# JDK(Java Development Kit)란?

자바 개발 키트로 자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성요소입니다.

이 중심에는 자바 컴파일러(Compiler)가 있습니다.

 

JDK는 JVM, JRE과 함께 자바 프로그래밍에 사용되는 3대 핵심 기술 패키지 가운데 하나입니다.

 

 

 

# JDK 와 JRE의 차이점

JDK : Standard Edition, Enterprise Edition 및 Micro Edition과 같은 자바 플랫폼에서 자바 응용프로그램을 개발하는 데 사용되는 소프트웨어 개발 환경입니다.

JRE : 자바 응용 프로그램을 실행하는 데 필요한 최소 요구 사항을 제공하는 JDK의 일부입니다.

 

 

JDK와 JRE의 차이점은 JDK는 자바 프로그램을 개발하고 실행할 수 있는 환경을 제공하는 반면

JRE는 자바 프로그램을 실행하는 환경 만 제공한다는 것입니다.

 

요약 => JDK는 JDE와 개발 도구의 조합, JRE는 JVM과 라이브러리 파일의 조합입니다.

반응형

 

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고도서

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

 

 

프로그램 언어의 다형성(多形性, polymorphism; 폴리모피즘)은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다.
(출처 : 위키피디아)

 

 

# 오버라이딩(overriding)과 오버로딩(overloading)

오버라이딩과 오버로딩을 다형성이라고 정의 할 수 없다고 생각한다.

(위 책에서는 다형성에 가장 기본을 오버라이딩, 오버로딩으로 보고 있다.)

다형성을 구현하는 방법 중 대표적으로 알려진 것이다.

 

 

  • 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의(오버라이딩)
  • 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의(오버로딩)

 

  • ride : 올라타다
  • load: 적재하다

 

인공위성에서 내려볼 때 오버라이딩(올라타기)된 경우는 맨 위에 올라탄 존재만 보인다.

오버로딩(적재하기) 된 경우는 옆으로 적재된 모든 적재물이 다 보인다.

 

 

Animal.java

package polymorphism01;

public class Animal {
	public String name;
    
    public void showName() {
    	System.out.printf("안녕 나는 %s야. 반가워\n", name);
    }
}

 

 

 

Penguin.java

package polymorphism01;

public class Penguin extends Animal {

  public String habitat;

  public void showHabitat() {
  System.out.printf("%s는 %s에 살아\n", name, habitat);
  }

  // 오버라이딩 - 재정의 : 상위클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
  public void showName() {
  	System.out.printf("어머 내 이름은 알아서 뭐하게요?");
  }
  
  
  // 오버로딩 - 중복정의 : 같은 메서드 이름, 다른 인자 리스트
  public void showName(String yourName) {
  	System.out.printf("%s 안녕, 나는 %s라고 해\n", yourName, name);
  }
}

 

 

Driver.java

package polymorphism01;

public class Driver {
	public static void main(String[] args) {
    	Penguin pororo = new Penguin();
        
        pororo.name = "뽀로로";
        pororo.habitat = "남극";
        
        pororo.showName();
        pororo.showName("초보람보");
        pororo.showHabitat();
        
        Animal pingu = new Penguin();
        
        pingu.name = "핑구";
        pingu.showName();
        }
}

 

 

 

실행결과

더보기

어머 내 이름은 알아서 뭐하게요?

초보람보 안녕, 나는 뽀로로라고 해

뽀로로는 남극에 살아

어머 내 이름은 알아서 뭐하게요?

 

 

 

실행 T 메모리

 

* 상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩 (재정의)한 메서드가

  호출된다는 사실을 꼭 기억하자.

반응형

 

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고도서

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

 

 

# 상속 : 재사용 + 확장

 

  • 객체 지향에서 상속이란 일반인들이 생각하는 상속이 아닌 확장, 세분화
    슈퍼 클래스 - 서브 클래스(상위 클래스 - 하위 클래스 개념으로 이해해야 한다.
  • 상위 클래스 쪽으로 갈수록 추상화, 일반화
  • 하위 클래스 쪽으로 갈수록 구체화, 특수화

 

 

 

  • 포유류는 동물의 특성을 확장
  • 고래는 포유류의 특성을 확장

 


# 하위 클래스는 상위 클래스다.

 

  • 아버지는 할아버지다??
  • 아들은 아버지다??
  • 딸은 아버지다??

위의 내용은 하위 클래스는 상위 클래스라는 조건에 만족하지 못한다.

 

  • 포유류는 동물이다.
  • 고래는 포율류다.
  • 고래는 동물이다.

 

"하위 클래스는 상위클래스다" 라는 문장은 로버트 C. 마틴이 주장하고 모두가 동의하는

객체 지향 설계 5원칙 가운데 LSP (리스코프 치환 원칙)를 나타내는 말이다.

 

리스코프 치완 원칙(위키백과 바로가기)

 

 

* 자바 언어에서는 inheritance(상속)라는 키워드가 아닌, extends(확장)가 존재한다.

 

 

 

반응형

 

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고도서

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

 

 

# 추상화란?

  • 추상 / 추상화는 일반인이 생각하는 의미와 전산용어로서의 의미가 다르지 않다.
  • 전산 분야에서 추상화는 영어로 Abstraction
  • 피카소로 인해 널리 알려진 추상화는 영어로 Abstract Paintiing과 같은 Abstract 이다.

 

이집트 벽화(출처 : Pixabay)

  • 피카소는 극사실주의와 같이 눈에 보이는 그대로의 사물(객체)을 그린 것이 아니라,
    마음 속에 느껴지는 그 사람의 특징을 그렸다.
  • 이집트 벽화(위 사진)을 보면 사람마다 키가 제각각인 것을 알 수  있다.
    바로 그 시대의 권력 크기에 비례해 키를 그렸다고 한다.
  • 이집트 화가는 실제 모습이 아닌 추상적인 모습을 그려서 오히려 그 인물의 특징을 더욱 정확하게 묘사했다.

 

 

 

 

# 추상화는 모델링이다.

 

  • 객체 지향의 4대 특성은 클래스를 통해 구현된다.(또는 객체)

  • 객체 : 세상에 존재하는 유일무이한 사물
  • 클래스 : 분류, 집합 같은 속성과 기능을 가진 객체를 총칭하는 개념

 

 

 

클래스 : 객체 = 펭귄 : 뽀로로 =사람 : 김연아 = 쥐 : 미키마우스

 

- 세상에 존재하는 유일무이한 객체를 특성(속성 + 기능)에 따라 분류해 보니,
  객체를 통칭할 수 있는 집합적 개념, 즉 클래스(분류)가 나오게 된다.

 

  • 객체는 유일무이한(unique)한 사물이다.
  • 클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.
  • 클래스를 이용해 object를 만들었다는 것을 강조할 때는 object라는 표현보다는,
    클래스의 인스턴스(instance)라는 표현을 쓴다.

 

 

 

추상화란 구체적인 것을 분해해서 관심 영역(어플리케이션 경계, Application Boundary)에

있는 특성만 가지고 재조합 하는 것 => 모델링

 

  • OOP의 추상화는 모델링이다.
  • 클래스 : 객체 = 펭귄 : 뽀로로
  • 클래스 설계에서 추상화가 사용된다.
  • 클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.
  • 객체 지향에서 추상화의 결과는 클래스다.

 

 

클래스 객체_참조_변수 = new 클래스 ()
객체_참조_변수의
자료형(Type)
생성된 객체를 참조할 수 있는 변수 할당문 새로운 만들고자 하는 객체의 분류 메서드
  클래스의 인스턴스, 즉 객체를 생성하기 위해 객체 생성자를 호출
새로운 객체를 하나 생성해 그 객체의 주소값(포인터)을 객체 참조 변수에 할당

 

 

 

반응형

 

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고도서

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

 

# 클래스 vs 객체 = 붕어빵틀 vs 붕어빵 ???

  • 클래스와 객체의 관계를 붕어빵틀과 붕어빵이 아니다.
  • 해당 이론을 코드로 옮겨서 논리가 맞는지 확인해보면 알 수 있다.

붕어빵틀을 생산하는 금형 기계가 있다.

그럼 붕어빵틀이 붕어빵을 찍어내서 클래스라고 하면,

붕어빵틀을 찍어내는 클래스가 된다.

 

 

금형기계 붕어빵틀 = new 금형기계();

 

위 코드를 인간적인 말로 변역해보면 다음과 같다.

 

새로운 금형기계를 하나 만들었더니 붕어빵틀이 되었다?

 

 

 

 

# 클래스와 객체를 구분하는 방법

 

  • 사람은 클래스인가? 객체인가?
  • 김연아는 클래스인가? 객체인가?
  • 뽀로로는 클래스인가? 객체인가?
  • 펭귄은 클래스인가? 객체인가?

 

객체 지향을 제대로 학습했으면 알아야 할 클래스와 객체를 구분하는 문제이다.

 

  • 사람의 나이는 몇 살인가?
  • 김연아의 나이는 몇 살인가?
  • 뽀로로의 나이는 몇 살인가?
  • 펭귄의 나이는 몇 살인가?

 

클래스는 분류에 대한 개념이지 실체가 아니다.

객체는 실체다.

 

 

위 이론을 이해하면 첫번째 위 문제의 정답이

 

클래스 : 사람, 펭귄

객체 : 김연아, 뽀로로

 

인 것을 알 수 있다.

 

반응형

 

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고도서

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com




# 객체 지향 개념의 탄생

  • 기계 중심의 기계어에서 조금 더 인간을 편하게 하는 언어로 발전 하다 발견
  • "우리가 눈으로 보고, 느끼고, 생활하는 현실 세계처럼 프로그래밍 할 수는 없을까?
    라는 고민 속에서 객체 지향의 개념이 탄생
  • 객체 지향은 현실 세계를 반영한다.
  • 0과 1로 대변되는 기계(컴퓨터)에 맞춰 사고하던 방식을 버리고
    현실세계를 인지하는 방식으로 프로그램을 만들자
    => 객체 지향은 직관적이다.

 

 

 

# 객체 지향을 이해하기 위해 생각해본 큰 그림

 

  • 세상에 존재하는 모든 것은 사물, 즉 객체(Object)이다.
  • 각각의 사물은 고유하다.
  • 사물은 속성을 갖는다.
  • 사물은 행위를 한다.

 

 

# 인간의 인지법인 사물을 분류(class)해서 이해

  • 직립보행을 하며 말을 하는 존재를 사람이라고 분류한다.
  • 연미복, 짧은 다리, 날지 못하는 새를 펭귄이라고 분류한다.
  • 밤하늘에 반짝이는 사물들을 별이라고 분류한다.

 

사람이라는 분류의 객체(Object) 속성(property) 행위(method)
이호창 나이, 키, 몸무게 등 먹다, 자다, 울다, 걷다 등
박호창 " "
김호창 " "

 

 

# 클래스 vs 객체 = 사람 vs 김종민 (UML 표기)

 

 

  • 위 UML 표기법 만 봐도 객체지향은 직관적인 걸 알 수 있다.
  • 우리가 사물을 인지하고 사고하는 방식에 맞기 때문

 

객체 지향은 인간의 인지 및 사고 방식까지 프로그래밍에 접목하는 인간(개발자) 지향을 실천하고 있는 것이다.

 

반응형

아래 글은 공부를 위해 객체지향의 원리 및 이해를 정리한 것 입니다.

 

📃 참고도서

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

COUPANG

www.coupang.com

 

 

 

# 프로그램이 메모리를 사용하는 방식

코드 실행 영역 데이터 저장 영역

 

 

# 객체지향 프로그램의 메모리 사용 방식

코드 실행 영역 스태틱(Static) 영역
스택(Stack) 영역 힙(Heap)영역

 

 

 

# main() 메서드: 메서드 스택 프레임

 

- main() 메서드는 프로그램이 실행되어 시작되고 끝나는 곳이다.

 

public class Start {
	public static void Main(String[] args) {
		System.out.printIn("Hello OOP!");
	}
}

 

위 코드가 실행 될 때 메모리 변화

스태틱 영역 - 클래스들의 놀이터
스택 영역 - 메서드들의 놀이터 영역 - 객체들의 놀이터

* 책의 저자는 위 메모리 구조가 T자와 같다고 해서 T메모리라고 부른다.

 

 

main() 메서드가 실행 되기 전 JVM에서 수행하는 전처리 작업들

  1. java.lang 패키지를 T 메모리의 스태틱 영역에 배치한다.
  2. import된 패키지를 T 메모리의 스태틱 영역에 배치한다.
  3.  프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치한다.

 

 

  • main() 메서드가 돌기 위해 스택 프레임(Stack frame)이 스택 영역에 할당
    => 메서드들의 놀이터는 스택(Stack)
  • 2번째 줄의 블록 시작 기호인 여는 중괄호를 만났을 때 main() 메서드의 스택 프레임이 생긴다.
    => 반대로 닫는 중괄호를 만나면 스택 프레임이 소멸된다.

 

 

  • 메서드의 인자 args를 저장할 변수 공간을 스택 프레임의 맨 밑에 확보한다.
    => 메서드 인자(들)의 변수 공간을 할당

  • JRE는 눈에 보이지는 않게 뒤에서 JVM이라고 하는 자바 가상 기계를 부팅하고,
    JVM은 메모리 구조를 만들고 거기에 java.lang패키지 로딩, 각종 클래스 로딩, main() 메서드 스택 프레임 배치,
    변수 공간 배치 등등의 일을 처리
  • System.out.printIn("Hello OOP!") 구문이 실행 되면 T 메모리에는 변화가 없다.
  • 메모리에는 코드 실행 공간은 별도로 있다.
  • System.out.printIn() 구문이 코드 실행 공간에서 실행되면 GPU(그래픽 처리 장치)에 화면 출력을 의뢰한다.
    => 이때 데이터 저장 공간인 T 메모리에는 아무런 변화가 없다.

 

 

 

반응형

+ Recent posts