[F-Lab 챌린지 16일차] 개구리책 1-5장

성수데브리·2023년 7월 17일
0

f-lab_java

목록 보기
15/73

프로그래밍 언어의 발전

  1. 어셈블리어

    *어셈블리어(영어: assembly language) 또는 어셈블러 언어(assembler language)[1]는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.*

    • 컴퓨터가 이해하는 언어인 0,1 이 아닌 기계어 명령어와 일상용어를 1:1 매칭한 코드표로 코드를 작성함
  • 매칭 코드표가 CPU 마다 다르다는 불편함이 있었음
  1. C 언어 : One Source Multi Object Use Anywhere
    • 하나의 소스파일로 이기종간 이식성 확보 One Source : 하나의 소스파일로 Multi Object : 기계에 맞는 컴파일러로 목적파일(기계어)을 만든 후 Use Anywhere : 모든 컴퓨터에서 실행 가능
  1. Write Once, Use Anywhere
    • 한 번의 컴파일로 이기종 간 이식성 확보 Write Once : 하나의 소스파일로 목적파일을 단 1개만 생성 Use Anywhere : 모든 컴퓨터에서 실행 가능
    • JVM 이라는 가상 머신의 등장으로 가능해졌다.

자바 기본

글쓴이가 주장하는 학습 방법 :

객체 지향을 이해해야 올바른 자바 프로그램을 만들 수 있고 스프링까지 이해할 수 있다.

어떤 언어에 녹아든 개념을 이해하기 위해서 개념부터 공부할 게 아니라 언어에 녹아 들어 있는 개념을 찾아 이해해보라.

자바 구조

  • 자바는 객체 지향 언어다.
  • 자바 프로그램의 개발과 구동은 자바 플랫폼 하나로 다 이뤄진다.

  • JDK : 자바 개발 도구
  • JRE : 작성한 자바 프로그램 실행 환경
  • JVM : 가상의 컴퓨터

→ JDK 를 이용해 개발된 프로그램은 JRE 에 의해 가상 컴퓨터인 JVM 상에서 구동된다.

메모리 구조

  • JVM 의 메모리 구조 : 더 세분화해야 되지만 대표적인 영역은 3가지가 있음

    • 스태틱 : 클래스의 놀이터
    • 스택 : 메서드의 놀이터
    • 힙 : 객체의 놀이터

구조/절차 언어의 흔적

  • 구조적 프로그래밍의 함수 : 함수는 중복 코드를 한 곳에 모아서 관리하고, 논리를 함수 단위로 분리해서 이해하기 쉬운 코드를 작성할 수 있게 한다.
    • 구조적 프로그래밍의 함수는 자바의 메서드에 해당한다. 자바 메서드 구현부는 절차적으로 코드를 선언한다.

JVM 실행 순서 (나의 추측..확인 필요)

  1. java.exe 로 .class 파일 실행
  2. JVM 프로세스 생성
  3. 메모리 할당 : T 구조 (스태틱, 스택, 힙)
  4. java.lang 패키지, import 패키지 스태틱 영역에 배치
  5. main 메서드가 있는 클래스 정보 스태틱 영역에 배치
  6. main 메서드 스택 프레임 생성

스택 프레임

  • JVM 은 여는 중괄호를 만나면 스택 프레임을 생성하고 닫는 중괄호를 만나면 스택 프레임을 제거한다.
  • 스택 프레임간 스택 프레임 안에 선언된 값에 접근할 수 없다. 값을 전달하려면 메서드 리턴값 또는 메서드 인자를 통해서만 가능하다.

자바의 객체지향

구조적 프로그래밍에서 함수를 도입하며 코드는 논리적 단위로 구분하고 분할해서 정복하였다.

그런데 패러다임이 또 등장했다. 우리가 사물을 인지하는 방식대로 프로그래밍하자는 것이다.

그것이 객체지향이다. 객체지향은 직관적이다.

인간의 인지법

  • 고유의 속성과 행위를 갖는 사물을 개별로 이해하기 보다 분류(class) 해서 이해하는 것
    • 예시 : 김연아, 박지성, 유재석은 사람 분류에 속한다.

객체지향의 특징 : 캡상추다

클래스 & 객체 차이

  • 클래스는 분류에 대한 개념이고 객체는 유일무이한 실체다.
  • 클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념
클래스 : 객체
펭귄 : 뽀로로
사람 : 김연아

추상화 : 모델링

  1. 구체적인것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것

  2. 추상화란 구체적인 것을 분해해서 관심 영역(애플리케이션 경계, Application Boundary) 에 있는 특성만 가지고 재조합하는 것 = 모델링

    • 예시 : 병원 어플리케이션에서 정형외과 손님, 신경외과 손님, 산부인과 손님은 환자로 분류할 수 있으며 환자만의 속성과 행위를 뽑아낼 수 있다.

    • 모델 : 추상화를 통해 실제 사물을 단순하게 묘사하는 것. 모델은 자바 언어에서 클래스로 표현된다.

  3. 추상화의 결과는 클래스다

    추상화 = 모델링 = 자바의 class 키워드
  4. 추상화와 메모리

    클래스 멤버 : 스태틱 영역에 할당된다. 모든 객체가 공통으로 지니는 속성이기 때문이다.

    객체마다 중복된 값을 위한 메모리 공간을 할당할 필요 없이 스태틱 영역에 할당하면 모든 객체가 공유할 수 있다.

    객체 멤버 : 스태틱 영역에는 이름 정보만 있고 값은 힙 영역에 할당된다. 값은 객체마다 다를 수 있다.

상속 : 확장&재사용

  • is ais kind of

  • 확장, 세분화, 슈퍼 클래스 - 서브 클래스

  • 상속의 개념은 조직도나 계층도가 아닌 분류도다.

    아버지는 할아버지다 ?

    참새는 조류다 ?

  • 상속과 인터페이스

    • 현 클래스 is able to 인터페이스
    • 무엇을 할 수 있다라고 하는 기능을 구현하도록 강제한다.
  • 상위 클래스는 물려줄 특성이 풍성할수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.

  • 상속의 T 메모리

다형성 : 사용 편의

  • 다형성의 가장 기본은 오버라이딩과 오버로딩

캡슐화 : 정보은닉

  • 정적 멤버 클래스명.정적멤버 형식으로 접근하다. 일관된 형식으로 접근하기 위함이다. 메모리의 물리적 접근방법에 따른 이유도 있다.
    // 클래스명.정적멤버 형식으로 접근할 때
    double pi = Circle.PI;
    
    // 객체참조변수.정적멤버 형식으로 접근할 때
    Circle circle = new Circle();
    double pi1 = circle.PI;
    클래스명으로 접근하면 스태틱 영역을 바로 참조하지만, 객체 참조변수로 접근하면 힙 영역 → 스태틱 영역 순으로 참조하게 된다.

자바가 확장한 객체 지향

  • 추상메서드와 추상클래스
  • 생성자
  • 클래스 생성 시 실행 블록 : static 블록
  • final 키워드
  • instanceof 연산자
  • package 키워드
    • 네임스페이스를 만들어주는 역할
    • 소유자
  • interface 와 implements 키워드
    • 람다란 함수를 의미하고 변수에 할당할 수 있다. 함수는 로직이다.
    • → 람다는 변수에 로직을 저장할 수 있고, 로직을 메서드의 인자로 쓸 수 있고, 로직을 메서드의 반환값으로 사용할 수 있다.
  • this, super 키워드
    • 메서드 스코프에서 지역변수와 객체 멤버 변수명이 겹칠 경우 지역변수가 우선한다.

클래스 코드 저장

  • 클래스의 객체 멤버 메서드는 로직은 객체마다 모두 동일하다. 객체를 힙 영역에 할당할 때마다 중복으로 할당하면 낭비다. 그래서 객체 멤버 메서드는 스태틱 영역에 단 하나만 보유한다.
  • 그리고 눈에 보이지 않지만 객체 멤버 메서드를 호출할 때 객체 자신을 나타내는 this 객체 참조 변수를 넘긴다.

0개의 댓글