Java 객체지향 프로그래밍 기본

yesjuhee·2024년 10월 24일

Java 공부

목록 보기
7/17

남궁성님의 Java의 정석 3판 "Chapter 06 객체지향 프로그래밍"을 읽고 저의 방식대로 정리한 글입니다! 자바 객체지향에 대한 기본적인 특징을 설명합니다.

객체지향 언어의 주요 특징

  1. 코드의 재사용성이 높다.
    : 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
  2. 코드의 관리가 용이하다.
    : 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
  3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
    : 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.

클래스

  • 클래스의 정의: 클래스란 객체를 정의해 놓은 것이다.
  • 클래스의 용도: 클래스는 객체를 생성하는데 사용된다.
  • 프로그래밍에서의 클래스: 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것. 사용자 정의 타입.

객체

  • 객체의 정의: 실제로 존재하는 것. 사물 또는 개념
  • 객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름.
  • 프로그래밍에서의 객체: 클래스에 정의된 내용대로 메모리에서 생성된 것.

객체와 인스턴스

인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구분할 필요는 없지만, 문맥에 따라 구별하여 사용하는 것이 좋다. 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 가지고 있다.

JVM의 메모리 구조

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

  1. 메서드 영역 (method area)

    : 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수(class variable)도 이 영역에 함께 생성된다.

  2. 힙 (heap)

    : 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수(instance variable)들이 생성되는 공간이다.

  3. 호출 스택 (call stack)

    : 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.

변수

  • 인스턴스 변수 (instance variable)
    • 클래스 영역에 선언된 변수.
    • 클래스의 인스턴스를 생성할 때 만들어진다.
    • 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 인스턴스변수로 선언한다.
  • 클래스 변수 (class varibale)
    • 클래스 영역에 static 을 붙여서 선언한 변수.
    • 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유한다.
    • 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스변수로 선언해야한다.
    • 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다.
    • public 을 앞에 붙이면 같은 프로그램 내에서 어디에서나 접근할 수 있는 전역변수의 성격을 갖는다.
  • 지역변수 (local variable)
    • 클래스 영역 의외의 영역 (메서드, 생성자, 초기화 블럭 내부)에 선언된 변수.

static

  1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

오버로딩 (overloading)

  • 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩 또는 간단히 오버로딩이라 한다.
  • 오버로딩이 성립하기 위해서는 1) 메서드 이름이 같아야 하고 2) 매개변수의 개수 또는 타입이 달라야한다.

가변인자 (varargs)

  • JDK1.5부터 메서드의 매개변수 개수를 동적으로 지정해줄 수 있으며 이를 가변인자(variable arguments)라고 한다.
    public PrintStream printf(String format, Object... args)
  • 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다.
  • 가변인자는 내부적으로 배열을 이용하는 것이다. 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성되는 비효율성이 숨어있기 때문에 유이해야한다.

생성자(Constructor)

생성자는 인스턴스가 생성될 때 호출되는 ‘인스턴트 초기화 메서드’이다. 참고로 연산자 new 가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다. 클래스에 정의된 생성자가 하나도 없을 때는 기본 생성자(default constructor)가 컴파일러에 의해 추가된다.

Card c = new Card();

/*
1. 연산자 new에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card 인스턴스의 주소거 반환되어 참조변수 c에 저장된다.
*/
class Car {
	String color;
	String gearType;
	int door;
	
	// 생성자에서 다른 생성자를 호출할 때는 this()를 사용한다.
	Car() {
		this("white", "auto", 4);
	}
	
	// 생성자를 이용해 인스턴스를 쉽게 복사할 수 있다.
	Car(Car c) {
		this(c.color, c.gearType, c.door);
	}
	
	// 'this'는 참조변수로 인스턴스 자신을 가리킨다. 
	// 'this'를 사용할 수 있는 것은 인스턴스 멤버 뿐이다, static멤버는 사용할 수 없다.
	Car(String color, String gearType, int door) {
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

변수의 초기화

멤버변수(클래스변수와 인스턴스변수)와 배열은 자동적으로 기본값(default value)로 초기화되지만, 지역변수의 초기화는 필수이다. (기본값: false, 0, null 등등) 멤버 변수의 초기화 방법으로는 1) 명시적 초기화, 2) 생성자, 3) 초기화 블럭 세 가지가 존재한다.

class InitTest {
	// 1) 명시적 초기화 (explicit initialization)
	static int cv = 1;
	int iv = 1;
	
	// 2) 초기화 블럭 (initialization block)
	static { // 클래스 초기화 블럭
		cv = 2;
	}
	{ iv = 2; } // 인스턴스 초기화 블럭
	
	// 3) 생성자 (Constructor)
	InitTest() {
		iv = 3;
	}
}

클래스변수의 초기화 순서: 기본값 → 명시적 초기화 → 클래스 초기화 블럭

인스턴스변수의 초기화 순서: 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자

profile
https://yesjuhee.tistory.com/

0개의 댓글