Chapter6. 객체지향 프로그래밍 I

객체지향언어

- 특징

  • 코드의 재사용성이 높다
  • 코드 관리가 용이하다
  • 신뢰성이 높은 프로그래밍이 가능하게 한다. 

클래스와 객체

- 클래스

  • 정의 
    • 객체를 정의해 놓은 것.
  • 용도
    • 객체를 생성하는데 사용.

- 객체

  • 정의
    • 실제로 존재하는 것(사물)
  • 용도
    • 기능과 속성에 따름

- 객체와 인스턴스화

  • 클래스를 인스턴스화 하여 인스턴스를 만드는 것을 인스턴스화라고 한다. 

- 객체의 구성요소 (속성과 기능)

  • 멤버(member)
    • 객체가 가지고 있는 속성과 기능을 그 객체의 멤버라고 함.

- 인스턴스 생성과 사용 

  • Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련됨.
Tv t;


  • Tv클래스의 인스턴스가 new 연산자에 의해 생성, 이 후 대입연산자를 통해 주소를 t에 저장.
t = new Tv();


  • 참조변수 t에 있는 인스턴스 멤버변수 channel에 7을 저장.
t.channel = 7;


  • Tv 클래스에 있는 chnnelDown 메서드 호출 
t.channelDown();


변수와 메서드

- 선언위치에 따른 변수와 종류

변수의 종류 선언위치 생성시기
클래스 변수
(class variable)
클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수
(instance variable)
인스턴스가 생성이 될 때
지역 변수
(local variable)
클래스 영역 이외의 영역
(메소드, 생성자, 초기화 블록 내부)
변수 선언문이 수행이 될 때
  • 인스턴스 변수
    • 독립적인 저장공간을 가짐(서로 다른 값을 가질 수 있음)
  • 클래스 변수 
    • 인스턴스 앞 static을 붙임. 공통으로 사용되는 값에 사용됨.
  • 지역변수
    • 메서드 내에 선언되어 메서드 내에서 사용가능
    • 메서드가 종료가 되면 자동으로 소멸됨.

- 메소드(method)

  • 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
  • 메서드를 사용하는 이유
    • 높은 재사용성
    • 중복된 코드의 제거
    • 프로그램의 구조화

- 메서드 선언과 구현

  • 메서드 선언부
    • 반환타입이 없는 것은 void타입을 입력
int add (int x, int y) { // 반환타입 메서드이름 매개변수
	int result = x + y;
    
    return result; // 결과를 반환
}
  • 메서드 구현부
    • {}안에 메서드를 호출 했을 때 수행할 문장을 입력
  • Return 문
    • 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것.
  • 지역변수
    • 메서드 내에 선언된 변수들을 지역변수라고 함.
int add(int x, int y) { // x, y는 지역변수
	int result x=y; // result 지역변수
    
    return result;
}

- 메서드의 호출

  • 인자와 매개변수
    • 인자(인수)
    • 메서드를 호출 할 때 괄호() 안에 지정한 값.
    • 인자의 개수와 순서는 호출 된 메서드에 선언된 매개변수와 일치해야 함.
    • 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것.
  • 메서드의 실행흐름
    • 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출 가능.
    • static메서드는 같은 클래스 내의 인스턴스 호출불가.
    • 메서드가 호출되면 지금까지 실행 중이던 메서드는 실행을 잠시 멈추고 호출된 메서드의 문장을 수행.

- Return 문

  • void
    • return문이 없어도 컴파일러가 자동적으로 return을 입력해줌.
  • 그 외 
    • 반드시 return 문이 있어야함. 
  • 반환값(return value)
    • 변수가 아닌 수식이 올 수 있음.
int add (int x, int y) { result x + y; }
  • 매개변수 유효성검사
    • 입력된 값이 매개변수와 같은 타입이 아닐 수도 있으니 메서드 내에 이러한 오류를 걸러낼 수 있도록 설계
float divide(int x, int y) {
	if(y==0) {
    	Sysytem.out.println("0으로 나눌 수 없습니다.");
        return 0;
        }
	return x / (float) y;
}

- JVM 메모리 구조

  • 메서드 영역(method area)
    • 프로그램 실행 중 어떤 클래스를 사용하면 해당 클래스의 클래스파일을 읽어 분석. 
    • 이때 클래스의 클래스변수도 이 영역에 함께 생성된다. 
  • 힙(heap)
    • 인스턴스가 생성되는 공간.
    • 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성됨.
  • 호출스택(call stack)
    • 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공
    • 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용됨.
    • 호출스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이다.
    • 아래에 있는 메서드가 바로 위의 메소드를 호출한 메서드이다.   

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

  • 기본형
    • 변수의 값을 읽기만 할 수 있다.
class Data { int x; } 

class PrimitiveParamEx {
	public static void main (String[] args) {
    	Data d = new Data();
        d.x = 10;
        System.out.println("x : " + d.x); // 10
        
        change(d.x); // 1000
        System.out.println("x : " + d.x); // 10
        
    }
    
    static void change(int x) { // 기본형 매개변수
    	x = 1000; 
    }
}

  • 참조형
    • 변수의 값을 읽고 변경 할 수 있다. (read & write)
class Data { int x; } 

class PrimitiveParamEx {
	public static void main (String[] args) {
    	Data d = new Data();
        d.x = 10;
        System.out.println("x : " + d.x); // 10
        
        change(d); //
        System.out.println("x : " + d.x); // 1000
        
    }
    
    static void change(Data d) { // 참조형 매개변수
    	d.x = 1000; 
    }
}

- 참조형 반환타입

  • 반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다. 
class Data { int x; } 

class PrimitiveParamEx {
	public static void main (String[] args) {
    	Data d = new Data();
        d.x = 10;
        
        Data d2 = copy(d);
        
        System.out.println("d : " + d.x); // 10
        System.out.println("d2 : " + d.x); // 1000
        
    }
    
    static Data copy(Data d) { // 참조형 매개변수
    	Data tmp = new Data();
        tmp.x = d.x;
        
        return tmp;
    }
}

- 재귀호출(recursive call)

  • 메서드의 내부에서 메서드 자신을 다시 호출하는 것을 재귀호출이라고 한다.
  • 재귀호출을 하는 메서드를 재귀 메서드라고 한다.

- 클래스 메서드와 인스턴스 메서드

  • 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 사용.
  • class 변수는 인스턴스를 생성하지 않아도 사용가능.
  • class 메서드는 인스턴스 변수를 사용하지 못함.
  • 메서드 내에 인스턴스 변수를 사용하지 않는 다면 static을 고려

- 클래스 멤버와 인스턴스 멤버간의 참조와 호출

  • 클래스 멤버에서 인스턴스 멤버 변수 호출이 불가한 이유
    • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만 반대로는 없을 수 있기 때문이다.

오버로딩(overloading)

  • 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름으르 사용해서 메서드를 지정이 가능함.

- 조건

  • 메서드의 이름이 같아야 한다. 
  • 매개변수의 개수 또는 타입이 달라야 한다. 
  • 반환타입이 오버로딩을 구현하는데 아무런 영향을 주지 않는다.
int add(int a, int b) {return a+b;}
long add(long a, long b) {return a+b;}
long add(int[] a) {[
	long result = 0 ;
    for(int i=0; i < a.length ; i ++ ) {
    	result += a[i];
    }
	return result;
}

생성자(contructor)

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

- 조건

  • 생성자의 이름은 클래스 이름과 같아야 한다. 
  • 생성자는 리턴 값이 없다. 
  • 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다. 

- 기본 생성자

  • 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 없을 때 뿐이다. 

- 매개변수가 있는 생성자

Car c = mew Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;

// 아래 한줄 코드로 처리가 가능함. 
Car c = new Car("white","auto",4);

- 생성자에서 다른 생성자 호출하기

  • 생성자의 이름으로 클래스의 이름 대신 this를 사용.
  • 한 생성자에서 다른 생성자를 호출 시 반드시 첫 죽에서 호출.
  • this()는 다른 생성자를 호출.
  • this는 클래스 내에 있는 인스턴스 호출.

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

Car(Car c) {
	color = c.color;
    gearType = c.gearType;
    door = c.door;
}

변수의 초기화

- 클래스 변수

  • 초기화 시점
    • 클래스가 처음 로딩될 때 단 한번 초기화
  • 초기화 순서
    • 기본값 >> 명시적 초기화 >> 초기화 블록 

- 인스턴스 변수

  • 초기화 시점
    • 인스턴스가 생성될 때 초기화
  • 초기화 순서
    • 기본값 >> 명시적 초기화 >> 초기화 블록 >> 생성자

'Language > Java' 카테고리의 다른 글

Chapter 14. 스트림(stream)  (0) 2022.11.30
Chaper 14. 람다식  (0) 2022.11.30
컬렉션(Collection)과 제네릭(Generic) (2)  (0) 2022.11.28
컬렉션(Collection)과 제네릭(Generic) (1)  (0) 2022.11.28
예외처리  (0) 2022.11.28