객체지향 프로그래밍2 - 클래스

김소희·2023년 2월 24일
1

클래스는 크게 네 가지의 요소로 구성되어 있다.

  1. 필드(field)
  2. 메소드(method)
  3. 생성자(constructor)
  4. 이너클래스(inner class)

이 중에서 필드와 메소드와 이너클래스를 맴버라고 한다.

<필드>

필드는 클래스 내부에 있는 변수로 객체의 속성을 담고 있다.

  • 자바의 변수
자바의 변수필드변수 여부Static 여부유효 범위저장 위치
클래스 변수 (cv)맴버변수Static 선언객체생성 이전에도 사용가능클래스 영역
인스턴스 변수 (iv)맴버변수객체생성 이후 사용가능힙메모리 영역
지역변수 (lv)그저 { } 안에서만 사용됨스택메모리 영역

자바의 변수 중에 클래스 변수와 인스턴스 변수를 필드 변수 또는 맴버 변수라고 한다.

JVM의 실행순서를 따라가며 저장공간을 생각해보자.

우리는 확장자가 .java인 자바소스코드에 코드를 작성한다. 실행을 시키면 컴파일러(javac)가 실행되며 .class인 파일로 변환되고, JVM의 Class Loader가 클래스들을 실행시키고 클래스 변수들은 RumRime Data Area의 Method Area에 저장이 된다.
이후 런타임이 시작되면 한줄씩 코드를 읽다가 new를 만나면 인스턴스와 인스턴스 변수들이 생성되고 Heap Area에 저장된다. 지역변수는 Stack Area에 저장된다.
런타임이 끝나면 인스턴스마다 각각 다른값을 저장할 수 있다.

reference
JVM이미지 https://blog.naver.com/jaewhan232/222356218837

<메소드>

메소드는 클래스 내부에 정의된 함수로 객체의 기능을 담당한다.

public static int add ( int a, int b){  //메소드 시그니처
int result = a+b;                       //메소드 바디
return result;
}

메소드를 작성할 때는 반환 타입이 void가 아닐 경우 반드시 retuen이 필요하고,
매개변수가 필요한 메소드는 호출 시에는 반환 타입이 일치하거나 자동 형변환이 가능해야 한다.

메서드 오버 로딩이란, 1개의 클래스 안에 같은 이름의 메소드를 여러 개 정의하는 것이다.
매개변수의 개수나 타입이 다르게 정의되면 자바는 다른 메소드 인줄안다.
그러므로 같은 이름의 메소드 안에서 변수 개수가 다르거나 타입이 다르면 잘 작동되므로 이점을 이용해서 여러 경우의 수를 일일이 재정의해야 하는 번거로움을 줄여준다.
오버 로딩의 대표적인 예시로 println() 메서드가 있다.
() 안에 String이 오든 int가 오든 전부 실행된다.

<생성자>

생성자는 객체가 생성될 때 호출되는 메소드로 필드를 초기화 한다.

인스턴스에서 필드의 값을 할당해두었는데 누군가가 의도치 않게 재할당을 해버린다면 곤란하니 접근을 막아야한다. 또한 새로운 인스턴스를 만든다면 사용 전에 값을 일일이 초기화 해주어야 할 것이다.
이러한 문제들은 생성자를 이용하여 해결할 수 있다.
생성자를 사용하면 객체를 생성함과 동시에 인스턴스 필드 값이 초기화가 되어 편리하다.
생성자는 반드시 메소드와 이름이 동일해야 한다.
반환 값은 없으며, 오버로딩이 가능하다.

생성자는 클래스 안에 반드시 1개이상 존재해야 하는데 만약 없으면
자바컴파일러가 런타임을 하다가 new로 생성자를 호출할때 자동으로 추가해준다.

▽ 자동으로 만들어진 생성자는 매개변수가 없다.

class Elevator{
	public Elevator(){}

▽ 매개변수가 있는 생성자를 만들어보았다.

	public Elevator(String type; int floors;){
       this.type = type;
       this.floors = floors;
       }
   };

▽ 매개변수가 있는 생성자 사용법

public static void main(String[] args) {
	Elevator apartment = new Elevator("승객용", 31;);
    Elevator hospital = new Elevator("병원용", 6;);
    
    System.out.println(apartment.type);    //승객용
    System.out.println(apartment.floors);  //31
    
    System.out.println(hospital.type);    //병원용
    System.out.println(hospital.floors);  //6

생성자는 반드시 메소드와 이름이 동일해야 한다.
반환 값은 없으며, 오버로딩이 가능하다.

매개변수가 있는 생성자의 두번째 줄에 쓰이는
this.는 참조 변수로서 (언젠가) 생성 될 인스턴스의 메모리 주소가 할당된다.
나중에 만들어질 인스턴스에 매개 변수로 받은 값을 할당 받는 역할이다.
apartment인스턴스의 "승객용", 31;는 .this가 가지고 있을 것이다.

비슷하게 생긴 this()도 있는데, this() 메소드는 자신이 속하고 있는 클래스에서 또 다른 생성자를 호출하는 경우에 쓰인다. 이를 이용해서 생성자 안에 생성자를 만들 수 있다.

<이너 클래스>

내부 클래스는 클래스 안에 선언된 클래스이다. 외부 클래스와 내부 클래스간에 연관이 있을때 사용한다.

내부 클래스를 사용하면 외부 클래스의 맴버들에 쉽게 접근할 수 있고, 코드의 복잡성도 줄일 수 있는 편의성 때문에 만들어졌다.

  • 내부 클래스는 4가지 종류로 구분할 수 있다.
종 류선언 위치사용 가능한 변수
인스턴스 내부 클래스외부 클래스의 맴버변수에 선언외부 인스턴스 변수, 외부 클래스 변수
클래스 내부 클래스외부 클래스의 맴버변수에 선언 (Static 선언)외부 클래스 변수
지역 내부 클래스외부 클래스의 메서드나 초기화 블럭 안에 선언외부 인스턴스 변수, 외부 클래스 변수
익명 내부 클래스클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스외부 인스턴스 변수, 외부 클래스 변수

내부 클래스 안에서 외부 클래스의 맴버를 참조할 때, 스태틱 내부 클래스 안에서는 인스턴스가 아직 생성되지 않은 시점일 수 있기 때문에 인스턴스를 참조할 수 없고,
내부 클래스 안에서 선언될 때, 스태틱 맴버는 스태틱 내부 클래스 에서만 선언할 수 있다.

profile
백엔드 개발자 소희의 모험

0개의 댓글