클래스의 또 다른 정의
클래스는 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;
}
메서드란?
- 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
- 값(입력)을 받아서 처리하고, 결과를 반환(출력)
- 중복되는 코드를 메서드로 만들어 메서드 호출만으로 수정과 관리를 쉽게 할 수 있다.
참고.
메서드는 클래스 안에 들어가 있어야 함.
함수는 클래스에 독립적.
메서드의 장점
- 코드의 중복을 줄일 수 있다.
- 코드의 관리가 쉽다.
- 코드를 재사용할 수 있다.
- 코드가 간결해서 이해하기 쉬워진다.
메서드의 작성
- 반복적으로 수행되는 여러 문장을 메서드로 작성
- 하나의 메서드는 한 가지 기능만 수행하도록 작성
메서드 = 선언부 + 구현부로 구성되어 있다.
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 메서드)로 되돌아와서 이후의 문장들을 실행한다.
'Study > Java' 카테고리의 다른 글
객체지향 프로그래밍 6장(16강 ~ 19강) (0) | 2022.06.03 |
---|---|
객체지향 프로그래밍 6장(11강 ~ 15강) (0) | 2022.06.03 |
객체지향 프로그래밍 6장(1강 ~ 5강) (0) | 2022.06.02 |
Java18_멀티스레드 (0) | 2022.05.14 |
Java16_컬렉션프레임워크 (0) | 2022.05.14 |