[JAVA의 정석] CH6. 객체지향 프로그래밍 1-2

[JAVA의 정석] CH6. 객체지향 프로그래밍 1-2

09) 클래스의 정의(1) - 데이터 함수의 결합

  • 클래스
    • 설계도
    • Data + 함수
    • 사용자 정의 타입.
    • 객체를 생성하기 위한 틀

  • 변수 : 하나의 데이터를 저장할 수 있는 공간
  • 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
  • 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
  • 클래스 : 데이터와 함수의 결합(구조체 + 함수)

10) 클래스의 정의(2) - 사용자 정의 타입

  • 사용자정의 타입(user-defined type) : 원하는 타입(클래스)를 직접 만들 수 있다.
class Time { // 클래스를 이용하여 원하는 사용자 정의타입 'Time' 생성
	int hour;
	int minute;
	float second;
}

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

  • 변수의 종류 : 클래스 변수(cv) , 인스턴스 변수(iv) , 지역 변수(lv)

12) 클래스 변수와 인스턴스 변수

  • 인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

13) 클래스 변수와 인스턴스 변수 예제

class Ex6_3 {
	public static void main(String args[]) {
		System.out.println("Card.width = " + Card.width);
		System.out.println("Card.height = " + Card.height); // 클래스 변수 (static 변수)는 객체생성 없이 '클래스이름.클래스 변수' 로 직접 사용 가능.

		Card c1 = new Card();
		c1.kind = "Heart"; // 인스턴스 변수의 값을 변경
		c1.number = 7; // 인스턴스 변수의 값을 변경

		Card c2 = new Card();
		c2.kind = "Spade"; // 인스턴스 변수의 값을 변경
		c2.number = 4; // 인스턴스 변수의 값을 변경

		System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
		System.out.println("c2는 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
		System.out.println("c1의 width와 height를 각각 50, 80으로 변경합니다.");
		Card.width = 50; // 클래스 변수의 값을 변경한다.
		Card.height = 80; // 클래스 변수의 값을 변경한다.

		System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
		System.out.println("c2는 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
	}
}

class Card {
	String kind;
	int number;
	static int width = 100;
	static int height = 250;
}

14) 메서드란?

  • 메서드 : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
  • 메서드선언문(header)구현부(body) 로 이루어져 있다.
  • 메서드의 장점 :
    • 코드의 중복을 줄여준다.
    • 코드 관리를 용이하게 한다.
    • 코드를 재사용 가능하게 한다.
    • 코드가 간결하여 이해하기 쉽게 한다.
  • 메서드의 작성 :
    • 반복적으로 수행되는 여러 문장을 메서드로 작성한다.
    • 하나의 메서드는 한 가지 기능만을 수행하도록 작성한다.

  • 수학의 함수와 달리 메서드는 입력값 또는 출력값(결과값)이 없을 수도 있으며, 심지어 입력값과 출력값이 모두 없을 수도 있다.
  • 출력값이 0개 일때 반환타입 void 사용

15) 메서드의 선언부

16) 메서드의 구현부

  • 메서드 선언문 다음에 오는 괄호{} 를 메서드의 구현부 라고 한다.

  • return문 : 메서드 반환타입이 void 가 아닌 경우, 구현부{} 안에 ‘return 반환값;’ 이 반드시 포함되어야 한다.

17) 메서드의 호출

메서드이름(값1, 값2, ...); //메서드를 호출하는 방법

print99danAll(); //void print99danAll()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고, 결과를 rseult에 저장.

18) 메서드의 실행 흐름

  1. 객체 생성
  2. 객체 호출

19) 메서드의 실행 흐름 예제

class Ex6_4 {
	public static void main(String args[]) {
		MyMath mm = new MyMath();
		long result1 = mm.add(5L, 3L);
		long result2 = mm.subtract(5L, 3L);
		long result3 = mm.multiply(5L, 3L);
		double result4 = mm.divide(5L, 3L);

		System.out.println("add(5L, 3L) = " + result1);
		System.out.println("subtract(5L, 3L) = " + result2);
		System.out.println("multiply(5L, 3L) = " + result3);
		System.out.println("divide(5L, 3L) = " + result4);
	}
 }

 class MyMath {
	long add(long a, long b) {
		long result = a + b;
		return result;
	//	return a + b;	// 위의 두 줄을 이와 같이 한 줄로 간단히 할 수 있다.
	}
	long subtract(long a, long b) { return a - b; }
	long multiply(long a, long b) { return a * b; }
	double divide(double a, double b) {
		return a / b;
	}
 }

20) return문

  • return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
  • 반환타입이 void인 경우, return문 없이도 아무런 문제가 없다.
    • 컴파일러가 메서드의 마지막에 ‘return;’을 자동으로 추가해주기 때문.

21) 반환값

  • 수학에서처럼, result값이 ‘x+y’와 같으므로 result 대신 ‘x+y’를 쓸 수 있다고 생각하면 된다.

22) 호출스택(call stack)

  • 호출스택 : 메서드의 작업에 필요한 메모리 공간을 제공한다.
  • 스택 : 밑이 막힌 상자 → 차곡차곡 쌓인다.

  • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
  • 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
  • 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다.
  • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
class Ex6_5 {
	public static void main(String[] args) {
		System.out.println("Hello");		
	}
}

  1. 준비
  2. JVM에 의해 main메서드 호출됨 → 프로그램 시작
    • 이때, 호출스택에는 main메서드를 위한 메모리공간이 할당되고 main메서드의 코드가 수행되기 시작.
  3. main메서드에서 println()을 호출한 상태.
    • 아직 main메서드가 끝난것은 아니기 때문에 main메서드는 호출스택에서 대기상태로 남아있고 println()메서드에 의해 ‘Hello’ 가 화면에 출력된다.
  4. println메서드의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 main메서드로 되돌아간다.
  5. main메서드에서도 더 이상 수행할 코드가 없으므로 종료된다. 호출스택은 완전이 비워지게 되고 프로그램은 종료된다.