1. 객체지향언어

객체지향언어의 기본 개념

실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용

 

객체지향언어의 주요 특징

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

 

=> 코드의 재사용성이 높고 유지보수가 용이

 

2. 클래스와 객체

  • 클래스
    • 정의 : 객체를 정의해 놓은 것
    • 용도 : 객체를 생성하는데 사용
  • 객체
    • 정의 : 실제로 존재하는 것. 사물 또는 개념
    • 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

 

클래스의 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정

클래스의 인스턴스(instance) : 클래스로부터 만들어진 객체

 

객체 = 속성 + 기능

  • 속성(property)
    • 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
  • 기능(function)
    • 메서드(method), 함수(function), 행위(behavior)

 

2.1. 인스턴스의 생성과 사용

클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

 

Tv클래스로부터 인스턴스를 생성하고, 인스턴스의 속성과 메서드를 사용하는 예제

class Tv {
	//Tv의 속성(멤버변수)
    String color; //색상
    boolean power; //전원상태
    int channel; //채널
    
    //Tv의 기능(메서드)
    void power() { power = !power}
    void channelUp { ++channel; }
    void channelDown() { --channel; }
}

class TvTest {
	public static void main(String args[]) {
    	Tv t; //Tv인스턴스를 참조하기 위한 변수 t를 선언
        t = new Tv(); //Tv인스턴스를 생성
        t.channel = 7;
        t.channelDown();
        System.out.println("현재 채널은 " + t.channel + " 입니다.");
     }
}

 

인스턴스는 참조 변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야함

 

2.2. 객체 배열

객체 배열 : 배열로 객체를 다루는 것

 

Tv[] tvArr = new Tv[3]; //참조변수 배열(객체 배열)을 생성

//객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

 

2.3. 클래스의 또 다른 정의

 

프로그래밍적인 관점에서 클래스의 정의와 의미

  1. 클래스 - 데이터와 함수의 결합
  2. 클래스 - 사용자정의 타입(user-defined type)

 

 

3. 변수와 메서드

 

3.1. 변수

class Variables
{
	//클래스 영역
	int iv;  //인스턴스 변수
   	static int cv;  //클래스변수(static 변수, 공유 변수)
    
    void method()
    {
    	//메서드 영역
    	int lv = 0; //지역 변수
    }
}

 

변수의 종류 선언위치 생성시기
클래스변수(class variable) 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스변수(instance variable) 클래스 영역 인스턴스가 생성되었을 때
지역변수(local variable) 클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때

 

  • 인스턴스 변수
    • 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐
    • 따라서 먼저 인스턴스를 생성한 후에 인스턴스 변수의 값을 읽어오거나, 저장 가능
    • 독립적인 저장 공간을 가지므로, 서로 다른 값을 가질 수 있음
  • 클래스 변수
    • 인스턴스 변수 앞에 static을 선언
    • 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유
    • 인스턴스를 생성하지 않고도 바로 사용 가능
  • 지역 변수
    • 메서드 내에 선언되어 메서드 내에서만 사용가능
    • 메서드가 종료되면 소멸되어 사용 불가

 

 

3.2. 메서드

메서드(method) : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

 

메서드를 사용하는 이유

  1. 높은 재사용성
  2. 중복된 코드의 제거
  3. 프로그램의 구조화

 

 

3.3. JVM의 메모리구조

 

 

  • 메서드 영역(method area)
    • 프로그램 실행 중, 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스 파일을 읽어서 분성하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장
  • 힙(heap)
    • 인스턴스가 생성되는 공간
  • 호출스택(call stack 또는 execution stack)
    • 메서드의 작업에 필요한 메모리 공간을 제공
    • 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용

 

3.4. 기본형 매개변수와 참조형 매개변수

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

  • 기본형 매개변수
    • 변수의 값을 읽기만 할 수 있음
    • read only
  • 참조형 매개변수
    • 변수의 값을 읽고 변경할 수 있음
    • read & write
    • 값이 저장된 곳의 주소를 알 수 있음

 

3.5. 클래스 메서드(static 메서드)와 인스턴스 메서드

클래스 : 데이터(변수)와 데이터에 관련된 메서드의 집합

  • 클래스 메서드 = static 메서드
    • 메서드 앞에 static이 붙어있음
    • 객체를 생성하지 않고도 '클래스이름.메서드이름()'으로 호출 가능
    • 인스턴스와 관계 없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드
  • 인스턴스 메서드
    • 반드시 객체를 생성해야 호출 가능
    • 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드

 

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

 

 

4. 오버로딩(overloading)

오버로딩 : 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것

오버로딩의 조건

  • 메서드 이름이 같아야 함
  • 매개변수의 개수 또는 타입이 달라야 함

 

5. 생성자(Constructor)

생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

생성자의 조건

  • 생성자의 이름은 클래스의 이름과 같아야 함
  • 생성자는 리턴 값이 없음

 

생성자가 수행되는 단계

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

 

5.1. 기본 생성자(default constructor)

모든 클래스에는 반드시 하나 이상의 생성자가 정의되어야 함

컴파일 시, 소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일 함

즉, 매개변수가 있는 생성자를 정의하면 기본 생성자도 무조건 추가해야 컴파일 에러가 나지 않음

 

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

생성자 간 서로 호출이 가능하기 위한 조건

  • 생성자의 이름으로 클래스이름 대신 this를 사용
  • 한 생성자에서 다른 생성자를 호출할 때는 만드시 첫 줄에서만 호출이 가능

 

Car() {
	color = "white";
    gearType = "auto";
    door = 4;
}

//생성자간 호출
Car() {
	this("white", "auto", 4);
}

 

  • this
    • 인스턴스 자신을 가리키는 참조변수
    • 인스턴스의 주소가 저장되어 있음
    • 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재
  • this(), this(매개변수)
    • 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

 

6. 변수의 초기화

멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적

 

멤버변수의 초기화 방법

  • 명시적 초기화(explicit initialization)
  • 생성자(constructor)
  • 초기화 블럭(initialization block)
    • 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
    • 클래스 초기화 블럭 : 클래스 변수를 초기화 하는데 사용

 

6.1. 명시적 초기화(explicit initialization)

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

 

6.2. 초기화 블럭(initialization block)

  • 인스턴스 초기화 블럭
    • 인스턴스 변수의 복잡한 초기화에 사용
    • 단순히 클래스 내에 블럭을 만들고, 그 안에 코드 작성
  • 클래스 블럭
    • 클래스 변수의 복잡한 초기화에 사용
    • 인스턴스 초기화 블럭 앞에 단순히 static을 덧붙임

 

6.3. 멤버 변수의 초기화 시기와 순서

  • 클래스 변수의 초기화 시점
    • 클래스가 처음 로딩될 때 단 한번 초기화 됨
  • 인스턴스 변수의 초기화 시점
    • 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어짐

 

  • 클래스 변수의 초기화 순서
    • 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
  • 인스턴스 변수의 초기화 순서
    • 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

 

 

복사했습니다!