본문 바로가기

Study/Java

객체지향 프로그래밍 6장(6강 ~ 10강)

728x90

클래스의 또 다른 정의

클래스는 3가지로 정의할 수 있다.

1. 클래스는 설계도이다.

2. 클래스는 데이터 + 함수의 집합이다.

객체지향 언어에서는 변수와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.

데이터 저장형태의 발전과정

 a. 변수 : 하나의 데이터를 저장할 수 있는 공간

 b. 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간

 c. 구조체 : 서로 관련된 여러 데이터(종류 관계 x)를 하나로 저 정할 수 있는 공간

 d. 클래스 : 서로 관련 있는 데이터와 함수(명령문 묶음)의 결합(구조체 + 함수)

 

3. 클래스는 사용자가 원하는 타입을 직접 만들 수 있다.

class Time{
    int hour;
    int minute;
    float second;
}

시, 분, 초를 저장하기 위한 세 변수를 멤버 변수로 갖는 Time 클래스를 정의하면.

Time t = new Time();

한 번의 객체 생성으로 Time 클래스의 멤버 변수를 사용할 수 있다.

 

비 객체지향적 코드와 객체지향적 코드의 비교

비객체지향적 코드 객체지향적 코드
int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3;
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();
int[] hour = new int[3];
int[] minute = new intp[3];
float[] second = new float[3];
Time[]  t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();

 

변수와 메서드

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

클래스 영역

 - 클래스 변수(인스턴스 변수) - instance variable

 - 클래스 변수(클래스 변수) - class variable(클래스 변수는 static 키워드가 붙어있다.)

 

메서드 영역

 - 지역변수 - local variable

 - 메서드가 끝날 때(scope <범위>) 자동으로 사라진다.(생명주기)

 

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

 

그런가보다 ~.

참고.

객체 = iv를 묶어놓은 것(외워)

cv는 아무 때나 사용 가능하고 객체 생성이 필요 없다.

 - 메모리에 올라가자마자 초기화된다.

iv는 객체 생성을 해야 사용할 수 있다.

lv는 메서드 끝나면 자동 제거

 

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

속성 중에 개별적인 속성과, 공통적인 속성이 있다.

개별적인 속성은 iv로, 공통적인 속성은 cv로 하면 된다.

 

객체를 생성해서 사용할 때

iv는 참조 변수 이름 c.kind로 사용하고

cv는 클래스 이름 Card.width으로 사용한다.

package com.seulgae.ch06;

public class CardTest {

	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; // 아아 ~ CV구나 !!
		Card.height = 80;
		
		System.out.println("c1은 " + c1.kind + ", " + c1.number
				+ "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
		System.out.println("c1은 " + c1.kind + ", " + c1.number
				+ "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
	}
}

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

출력결과

 

메서드란? 

-  특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.

-  값(입력)을 받아서 처리하고, 결과를 반환(출력)

Black Box

-  중복되는 코드를 메서드로 만들어 메서드 호출만으로 수정과 관리를 쉽게 할 수 있다.

 

참고.

메서드는 클래스 안에 들어가 있어야 함.

함수는 클래스에 독립적.

 

메서드의 장점

- 코드의 중복을 줄일 수 있다.

- 코드의 관리가 쉽다.

- 코드를 재사용할 수 있다.

- 코드가 간결해서 이해하기 쉬워진다.

 

메서드의 작성

- 반복적으로 수행되는 여러 문장을 메서드로 작성

- 하나의 메서드는 한 가지 기능만 수행하도록 작성

 

메서드 = 선언부 + 구현부로 구성되어 있다.

메서드의 구성

Q. 매개변수가 뭡니까? -> parameter declaration

매개변수는 메서드가 작업을 수행하는 필요한 값들(입력)을 제공받기 위한 것

 

참고. 반환 타입이없을 땐 void로 적는다.

 

지역변수(메서드 내에 선언된 변수)

- 지역변수는 메서드 내에서 사용하기 때문에 이름이 겹쳐도 상관이 없음.

- 매개변수도 지역변수 입니다.

int add(int x, int y){
	int result = x+y;
    	return result;
}

int multiply(int x, int y){
	int result = x * y;
   	return result;
}

 

메서드의 호출

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

print99danAll(); // void print99danAll()을 호출

- 반환값이 없고, 출력결과만 콘솔에 출력해주는 메서드이기에 매개변수가 없다.

int result = add(3,5) // int add(int x, int y)를 호출하고, 결과를 result에 저장

- 매개변수에 3과 5를 전달하여 메서드에서 결과값 return a+b 값을 저장하여 반환.

package com.seulgae.ch06;

public class MyMathTest {

	public static void main(String[] args) {
		// 2. MyMath 객체생성
		MyMath mm = new MyMath();
		// 3. MyMath 객체 사용(객체의 메서드 호출)
		
		long result1 = mm.add(5L, 3L); // add 메서드 호출, 작업을 마치면 호출한 곳으로 돌아옴, result1 에 8을 저장함.
		long result2 = mm.subtract(5L, 3L);
		long result3 = mm.multiply(5L, 3L);
		// double대신 long값으로 호출하였다. 이 값은 double로 자동형변환 된다.
		double result4 = mm.divide(5L, 3L);
		long result5 = mm.Max(3L, 5L);
		mm.printGugudan(0); //구구단 3단을 출력

		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);
		System.out.println("Max(5L, 3L) = " + result5);
	}
}

// 1. MyMath클래스 작성(메서드 작성)
class MyMath {
	void printGugudan(int dan) {
		if(!(2<=dan && dan <= 9))
			return; // 입력받은 단(dan)이 2 ~ 9가 아니면, 메서드 종료하고 돌아가기
		
		for (int i = 0; i <= 9; i++) {
			System.out.printf("%d * %d = %d%n", dan, i, dan * i);
		}
		
//		return; //생략가능
	}
	
	long add(long a, long b) {
//		long result = a + b; // 5, 3
//		return result; // 8
		return a+b; //위의 두줄을 이와 같이 한 줄로 간단히 할 수 있다.
	}
	
	// 두 값을 받아서 둘중에 큰 값을 반환하는 메서드를 작성하시오.
	long Max(long a, long b) {
		if(a>b) 
			return a; // 조건식이 참일때만 실행
		else
			return b; // 조건식이 거짓일 때 실행
//		else
//			return b;
//		return a > b ? 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;
	}
}

 

메서드의 실행 흐름

1. main 메서드에서 메서드 add를 호출한다. 인수 1L과 2L이 메서드 add의 매개변수 a, b에 각각 복사(대입) 된다.

2. 메서드 add의 괄호{}안에 있는 문장들이 순서대로 수행된다.

3. 메서드 add의 모든 문장이 실행되거나 return문을 만나면, 호출한 메서드(main 메서드)로 되돌아와서 이후의 문장들을 실행한다.

메서드의 실행흐름

 

 

반응형