라봉이의 개발 블로그

java의 정석 6강. 객체지향프로그래밍1 본문

Java/Java의 정석 읽고 정리

java의 정석 6강. 객체지향프로그래밍1

Labhong 2018. 5. 28. 18:08
반응형

객체지향은 c++과 유사한 점이 많으니 특징과 다른 점만 짚고 넘어가도록 하겠다.



1. 변수와 메서드

1.1 선언 위치에 따른 변수의 종류


변수 종류: 클래스 변수, 인스턴스 변수, 지역 변수


  • 클래스 변수: 멤버변수 중 static이 붙은 변수

  • 인스턴스 변수: 멤버변수 중 static이 붙지 않은 변수

  • 지역 변수: 멤버변수를 제외한 나머지 변수

class Variable{
  int instanceValue;          // 인스턴스 변수
  static int classValue;      // 클래스 변수

  void method1() {
    int localValue = 0;       // 지역 변수
  }
}


1) 인스턴스 변수

  • 클래스 영역에서 선언
  • 인스턴스가 생성되었을 때 생성
  • 인스턴스는 독립적인 저장공간을 가지므로 인스턴스마다 서로 다른 인스턴스 변수를 가질 수 있다.

2) 클래스 변수
  • 클래스 영역에서 선언
  • 클래스가 로딩될 때 생성, 프로그램이 종료될 때까지 유지된다.
  • 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하게 된다.
  • public을 앞에 붙이면 같은 프로그램 내에 어디서나 접근할 수 있는 전역변수의 성격을 갖는다.
3) 지역 변수
  • 매서드 내에 선언되어 매서드 내에서만 사용 가능
  • 매서드가 종료되면 소멸


1.2 매서드


매서드는 어떤 작업을 수행하기 위한 명령문의 집합이다.



1.3 JVM의 메모리 구조


응용 프로그램이 실행되면 JVM운영체제로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.


그 중 주요 런타임 데이터 영역에 대해 알아보자.


1) Method 영역

- 프로그램 실행 중 어떤 클래스가 사용되면 해당 class 파일을 읽어 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 클래스 변수(class variable) 또한 저장한다.


2) 힙 영역

- 인스턴스가 생성되는 공간. 인스턴스 변수(instance variable)들이 생성되는 공간이다.


3) 호출스택

- 호출스택은 메서드 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.



1.4 기본형 매개변수와 참조형 매개변수


자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.

매개변수 타입기본형이면 기본형 값이 복사되지만, 참조형이면 인스턴스의 주소가 복사된다.

출력:

기본형 메서드 값 변경: 1

참조형 메서드 값 변경: 10


위의 사진을 보면 알 수 있듯이 기본형 매개변수는 값을 복사하기 때문에 복사된 데이터가 값이 바뀔 뿐 원래의 값은 바뀌지 않지만 참조형 매개변수는 주소값을 복사하기 때문에 원래의 데이터에 접근해서 값을 변경할 수가 있다.


2. 생성자

2.1 생성자란

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.


Card 클래스의 인스턴스를 생성하는 코드를 예를 들어, 수행되는 과정을 단계별로 나누면 다음과 같다.

Card c = new Card();

1. 연산자 new에 의해 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행
3. 연산자 new의 결과로, 생성된 Card의 인스턴스의 주소가 반환되어 참조변수 c에 저장.



2.2 생성자에서 다른 생성자 호출하기. - this(), this


생성자 간에 서로 호출하기 위해서는 다음 두 조건을 만족시켜야한다.

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.

  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

class Car {
    String color;
    String gearType;
    int door;

    Car() {
        this("white", "auto", 4);
    }
    Car(String color) {
        this(color, "auto", 4);
    }
    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

public class Main {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car("blue");

        System.out.println("c1의 color = " + c1.color + ", gearType = " + c1.gearType + ", door = " + c1.door);
        System.out.println("c2의 color = " + c2.color + ", gearType = " + c2.gearType + ", door = " + c2.door);
    }
}



2.3 생성자를 이용한 인스턴스 복사


복사생성자 만들 듯이 만들면 된다.



3. 변수의 초기화

3.1 변수의 초기화


맴버변수와 배열의 초기화는 선택적(디폴트값으로 초기화 됨)이지만, 지역 변수는 반드시 사용하기 전에 초기화를 해주어야 한다.



3.2 명시적 초기화

변수를 선언과 동시에 초기화 하는 것

int door = 4;



3.3 초기화 블럭(initialization block)


초기화 블럭은 두가지 종류가 있다.

  • 클래스 초기화 블럭: 클래스 변수의 복잡한 초기화에 사용.

  • 인스턴스 초기화 블럭: 인스턴스 변수의 복잡한 초기화에 사용된다.

둘 다 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하면 된다.
클래스 초기화 블럭은 블럭{} 앞에 static을 붙이면 된다.

클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때마다 수행된다.
그리고 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다.

예제)
public class Main {
    static {
        System.out.println("static { }");
    }
    {
        System.out.println("{ }");
    }

    public Main() {
        System.out.println("생성자");
    }

    public static void main(String[] args) {
        System.out.println("Main mn = new Main();");
        Main mn = new Main();

        System.out.println("Main mn2 = new Main();");
        Main mn2 = new Main();
    }
}

출력: 

static { }

Main mn = new Main();

{ }

생성자

Main mn2 = new Main();

{ }

생성자


반응형
Comments