자바를 배우다보니 용어가 헷갈려서 제대로 짚고 넘어갈 필요가 있다고 느껴 정리해둔다.
- 클래스는 객체를 생성하는데 사용된다.
- 변수(데이터)와 함수(메서드)의 모음이다.
- 원하는 타입을 직접 만들 수 있다.
객체를 만들기 위한 틀, 설계도라고 생각하면 된다. 클래스에서는 여러가지 객체를 생성할 수가 있다.
TV 설계도로 예를 들자면
TV라는 객체는 속성과 기능으로 이루어져있다. 속성은 변수와 같고, 기능은 메서드라고 생각하면 된다.
객체 = 변수 + 메서드
TV라는 객체의 속성과 기능을 보자
속성 | 기능 |
---|---|
크기, 길이, 높이, 색상, 볼륨, 채널 등 | 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등 |
CLASS Tv { // TV라는 클래스
// 속성 -> 변수
String color; // 색깔
boolean power; // 전원상태
int channel; // 채널
// 기능 -> 메서드
void power() {power = !power;}
void channelUp() {channel++;}
void channelDown() {channel--;}
}
이 내용을 가지고 코드를 작성해본다면 이렇게 될 것이다.
객체를 생성하려면 참조변수를 선언하고, 객체의 주소를 참조변수에 저장해야한다.
Tv t; // Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 T에 저장
Tv t = new Tv(); // 간단히 한 문장으로 객체를 생성할 수 있다
생성한 객체를 사용하는 방법은 다음과 같다.
t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다
t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다
System.out.println("현재 채널은 " + t.channel + " 입니다.");
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 라고 한다.
그 객체가 메모리에 할당되어 실제 메모리를 차지하는 것을 인스턴스라고 한다.
※ 객체와 인스턴스는 거의 같다고 보면 됨.
객체 = 인스턴스 변수의 묶음.
모든 인스턴스를 대표하는 일반적인 용어로 '객체'를 사용.
인스턴스는 특정 클래스로부터 생성된 객체를 말한다. TV라는 클래스로부터 만들어진 객체를 TV인스턴스 라고 함. (인스턴스화해서 제품을 만들어야 우리가 TV를 사용할 수 있음)
작성된 클래스를 토대로
이런 객체가 만들어진다.
String coffeeBean; // 데이터가 없는 비어있는 객체가 생성된 것
coffeeBean = new String("Arabica"); // 인스턴스화 한다(객체를 실제로 메모리에 할당하는 과정)
자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있다.
이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있다.
해당 클래스의 모든 메서드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 된다.
- 클래스 안에 반드시 들어가 있어야 하는 함수
- 작업단위로 문장들을 묶어서 이름을 붙인 것.
- 값(입력)을 받아서 처리하고, 결과를 반환(출력)
public static void main(String args[]) {
...
for (int i=0; i<10; i++)
numArr[i] = (int)(Math.random()*10); // 배열 초기화
for(int i=0; i<10; i++)
System.out.printf("%d",numArr[i]);
System.out.println(); // 배열 출력
// 중간 생략
for(int i=0; i<10; i++)
System.out.printf("%d",numArr[i]);
System.out.println(); // 배열 출력
}
위 코드의 중복되는 부분(배열 출력)을 메서드로 만들면 아래처럼 된다.
static void printArr(int[] numArr){
for(int i=0; i<10; i++)
System.out.printf("%d",numArr[i]);
System.out.println();
}
public static void main(String args[]) {
...
for (int i=0; i<10; i++)
numArr[i] = (int)(Math.random()*10);
printArr(numArr); // 배열을 출력
// 중간 생략
printArr(numArr); // 배열을 출력
}
반복적으로 수행되는 여러 문장을 메서드로 작성할 수 있다.
하나의 메서드는 한 가지 기능만 수행하도록 작성하자.
메서드를 사용하면 코드의 중복을 줄일 수 있고, 코드의 관리가 쉬워지며, 코드를 재사용할 수 있다. 코드가 간결해서 이해하기도 쉬워진다.
메서드 = 선언부 + 구현부
- 작업에 필요한 매개변수는 0개 부터 여러개까지 넣을 수 있다.
- 여러 개의 값을 결과로 주고 싶으면 배열로 묶으면 된다.
- 반환타입에는 작업 결과의 반환타입을 적는다. 반환할 것이 없으면 반환 타입에 void라고 적으면 됨.
메서드를 생성할 때는 이렇게 써준다.
반환타입 메서드이름 (타입 변수명, 타임 변수명, ...) // 선언부
{ // 구현부
// 메서드 호출 시 수행될 코드
}
int add(int a, int b) // 선언부
{ // 구현부
int result = a + b;
return result; // 호출한 메서드로 결과를 반환함.
}
메서드를 호출할 때는 이렇게 써준다.
메서드이름(값1, 값2, ...); // 작업에 필요한 값들을 넣어줌
print99danAll(); // void print99danAll()을 호출
int result = add(3,5); // int add(int x, int y)를 호출하고, 결과를 result에 저장
MyMath mm=m new MyMath(); // 먼저 인스턴스를 생성한다
long value = mm.add(1L, 2L); // 메서드를 호출한다
long add(long a, long b) {
long result = a + b;
return result;
}
메서드에는 static 메서드와 인스턴스 메서드가 있다.
둘은 정반대의 성격을 지니고 있다고 생각하면 쉽다.
- 클래스 메서드라고도 함.
- 메서드 앞에 static이 붙음.
- 객체 생성없이(객체 생성을 안 하니 참조변수도 없다고 이해하면 쉬움) '클래스이름.메서드이름()'으로 호출한다.
- 인스턴스 멤버와 관련없는 작업을 함. 메서드 내에서 인스턴스 변수(instance variable) 사용 불가.
- 메서드 앞에 static이 붙지 않음.
- 인스턴스를 생성 후, '참조변수.메서드이름()'으로 호출한다.
- 인스턴스 멤버와 관련된 작업을 하는 메서드. 메서드 내에서 인스턴스 변수(instance variable)를 사용 가능.
예) Math.random()
메서드
Math.round()
도 마찬가지다. 이런 메서드들이 전부 static 메서드다.아래는 인스턴스 메서드와 클래스 메서드의 차이를 보여주기 위한 예시다.
class MyMath2 {
long a, b; // 인스턴스 변수(iv)를 사용
long add() { // 인스턴스 메서드
return a + b;
}
static long add(long a, long b) { // 클래스 메서드(static메서드), 지역변수(lv)를 사용
return a + b;
}
}
두 메서드는 이름도 반환타입도 똑같지만 매개변수가 다르다.
그리고 사용하는 변수도 다르다.
각 메서드들을 어떻게 사용하는 지 보자.
class MyMathTest2 {
public static void main(String args[]) {
System.out.println(MyMath2.add(200L, 100L); // 1. 클래스메서드 호출
MyMath2 mm = new MyMath2(); // 1. 인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm,add()); // 2. 인스턴스메서드 호출
}
}
클래스메서드
이름(MyMath2).메서드이름(add)()
로 호출인스턴스 메서드
참조변수(mm).메서드이름(add)()
로 호출.종합해보자면, 인스턴스 변수의 사용 가능 여부가 두 메서드의 차이점이라고 할 수 있다.
인스턴스 변수를 사용해야한다면 인스턴스 메서드를 사용하면 되고,
아니라면(객체가 필요없다면) 클래스 메서드를 사용하면 된다.
변수는 멤버변수, 지역변수 2가지 종류로 나눌 수 있다.
멤버변수는 클래스변수, 인스턴스변수 두 가지로 나눌 수 있고, 지역변수까지 하여 변수는 총 3가지 종류가 있다.
클래스변수, 인스턴스변수는 멤버변수이며 이 외의 변수는 모두 지역변수이다.
클래스 영역내에 위치한다.
참고