• 클래스
    • 객체는 '의사나 행위가 미치는 대상'으로 이를 코드로 구현한 것이 클래스이다.
    • 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.
    • 클래스명의 시작은 대문자로 작성(권장)
    • class라는 예약어를 사용해서 클래스를 생성한다.
    • 객체의 속성과 기능을 코드로 구현한 것이다.
      • 객체의 속성을 표현하는 필드(field),
      • 객체의 기능을 표현하는 메소드(method)로 구성된다.
      • 클래스가 메모리 공간에 생성된 상태가 인스턴스
  • 필드
    • 클래스에 포함된 변수이다.
    • 클래스 내에서 필드는 선언된 위치에 따라 분리된다.
      • 클래스 변수(static variable) : 해당 클래스의 모든 인스턴스가 공유해야 하는 값을 유지하기 위해 사용
        • 메소드 영역에 저장, 클래스가 메모리에 올라갈 때 -> 프로그램 종료
        • 인스턴스를 생성하지 않고도 바로 사용할 수 있다.
        • 공유 변수라고도 한다.
      • 인스턴스 변수(instance variable) : 인스턴스마다 가져야 하는 고유한 값을 유지하기 위해 사용
        • 힙 영역에 저장, 인스턴스의 생성 -> 종료
      • 지역 변수(local variable) : 메소드나 생성자, 초기화 블록 내에 위치한 변수
        • 스택 영역, 블록 내에서 변수의 선언문이 실행될 때 -> 블록을 벗어날 때
  • 메소드
    • 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.
    • [접근 제어자] [반환 타입] [메소드명] (매개변수) { [명령문] }
      • 접근 제어자 : 해당 메소드에 접근할 수 있는 범위를 명시한다.
      • 반환 타입 : 메소드가 모든 작업을 마치고 반환하는 데이터 타입을 명시한다.
      • 메소드명 : 메소드를 호출하기 위한 이름을 명시한다.
      • 명령문 : 메소드의 고유 기능을 수행한다.
    • 메소드의 호출 : 참조 연산자(.)를 사용하여 호출 -> 객체참조변수명.메소드명( [ 매개변수가 있다면 사용] );
      • 클래스 메소드(static method) : 클래스 변수와 마찬가지로 인스턴스를 생성하지 않고 바로 사용할 수 있다.
      • 인스턴스 메소드(instance method)
    • 메소드 오버로딩 : 매개변수의 개수나 타입을 다르게 하여 같은 이름의 또 다른 메소드를 작성하는 것이다.
  • 인스턴스
    • 인스턴스(instance) : 선언된 해당 클래스 타입의 객체
    • 자바에서 클래스를 사용하기 위해서는 해당 클래스 타입의 객체(object)를 선언해야 한다.
    • 이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화라고 한다.
    • 즉, 인스턴스란 메모리에 할당된 객체를 의미한다.
    • 자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있다.
    • 이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있다.
    • 하지만 해당 클래스의 모든 메소드는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 된다.
  • 생성자
    • 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 메소드
    • 생성자의 이름은 반드시 해당 클래스의 이름과 동일하다.
    • 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
    • 생성자의 선언 : 클래스명( [매개변수] ) { }
    • 생성자의 호출 : new 키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출된다.
    • 클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다.
    • 하지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태이다.
    • 생성자 초기화를 위한 데이터를 인수로 전달받을 수 있다.
    • 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
    • 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다.
      • 기본 생성자
        • 기본 생성자 선언 : 클래스명( ) { }
        • 자바 컴파일러는 기본 생성자를 기본적으로 제공한다.
        • 매개변수를 하나도 가지지 않으며, 아무런 명령어도 포함하고 있지 않는다.
        • 자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 한다.
        • 만약 매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 자동으로 추가되지 않는다.
        • 매개변수를 가지는 생성자를 하나 이상 정의한 후 기본 생성자를 호출하면, 오류가 발생할 것이다.
  • 메모리 구조
    • 모든 자바 프로그램은 자바 가상 머신(JVM)을 통해서 실행된다.
    • 자바 프로그램이 실행되면, JVM은 OS로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.
    • 이렇게 할당받은 메모리를 JVM은 용도에 따라 구분하여 관리한다.
      • 메소드 영역 : 클래스, 클래스 변수
      • 힙 영역 : 객체, 인스턴스
      • 스택 영역 : 메소드, 지역 변수, 매개 변수
    • 메소드 영역
      • 클래스와 클래스 변수(static variable)가 저장되는 영역
      • JVM은 클래스 파일(*. class)을 읽어서 해당 클래스에 대한 정보를 메소드 영역에 저장한다.
    • 힙 영역
      • 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역
      • JVM은 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.
      • 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
    • 스택 영역
      • 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역이다.
      • 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개 변수를 스택 영역에 저장한다.
      • 스택 영역은 push 동작으로 데이터를 저장하고, pop 동작으로 데이터를 인출한다.
      • LIFO(후입 선출) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
      • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

'백엔드 > JAVA' 카테고리의 다른 글

추상 클래스, 내부 클래스, 인터페이스  (0) 2021.08.31
제어자  (0) 2021.08.31
상수, 리터럴, enum  (0) 2021.08.31
스트림 API  (0) 2021.08.22
람다 표현식(lambda expression), 메소드 참조  (0) 2021.08.22