[Java] 클래스, 객체, 인스턴스, 메서드, 변수

peace w·2023년 10월 28일
0

Java

목록 보기
4/6

자바를 배우다보니 용어가 헷갈려서 제대로 짚고 넘어갈 필요가 있다고 느껴 정리해둔다.

클래스

  • 클래스는 객체를 생성하는데 사용된다.
  • 변수(데이터)와 함수(메서드)의 모음이다.
  • 원하는 타입을 직접 만들 수 있다.

객체를 만들기 위한 틀, 설계도라고 생각하면 된다. 클래스에서는 여러가지 객체를 생성할 수가 있다.

TV 설계도로 예를 들자면

  • TV 설계도라는 클래스는 TV라는 객체를 만들기 위해 필요하다.
  • TV 설계도는 왜 필요한가? 설계도가 있으면 TV라는 제품을 쉽게 만들 수 있다.
  • TV는 왜 필요한가? 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;
    }
  1. main 메서드에서 메서드 add를 호출한다. 인수 1L, 2L이 메서드 add의 매개변수 a,b에 각각 복사(대입)된다.
  2. 메서드 add의 괄호{} 안에 있는 문장들이 순서대로 수행된다.
  3. 메서드 add의 모든 문장이 실행되거나 return 문을 만나면, 호출한 메서드(main메서드)로 되돌아와서 이후의 문장들을 실행한다.

메서드에는 static 메서드인스턴스 메서드가 있다.
둘은 정반대의 성격을 지니고 있다고 생각하면 쉽다.

static 메서드

  • 클래스 메서드라고도 함.
  • 메서드 앞에 static이 붙음.
  • 객체 생성없이(객체 생성을 안 하니 참조변수도 없다고 이해하면 쉬움) '클래스이름.메서드이름()'으로 호출한다.
  • 인스턴스 멤버와 관련없는 작업을 함. 메서드 내에서 인스턴스 변수(instance variable) 사용 불가.

인스턴스 메서드

  • 메서드 앞에 static이 붙지 않음.
  • 인스턴스를 생성 후, '참조변수.메서드이름()'으로 호출한다.
  • 인스턴스 멤버와 관련된 작업을 하는 메서드. 메서드 내에서 인스턴스 변수(instance variable)를 사용 가능.

예) Math.random() 메서드

  • static 메서드임. 그래서 앞에 클래스 이름인 Math가 붙었다.
  • 사용할 때 참조변수 적지 않고, 객체를 생성하지도 않는다.
  • 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가지 종류가 있다.

클래스변수, 인스턴스변수는 멤버변수이며 이 외의 변수는 모두 지역변수이다.

멤버변수

클래스 영역내에 위치한다.

클래스 변수(class variable)

  • 클래스 영역에 선언되며, 인스턴스변수 앞에 static을 붙인다.
  • 하나의 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성을 클래스 변수로 선언한다.
    (TV로 예를 들면, 화면 Boolean의 true값)
  • 클래스 변수는 해당 클래스가 종료될 때 까지 유지되며 전역변수의 성격을 갖는다.

인스턴스 변수(instance variable)

  • 클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어진다.
  • 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 인스턴스변수로 선언한다.
    (TV로 예를 들면, 화면의 크기)

지역변수(local variable)

  • 메서드 내에 선언되며 메서드 내에서만 사용 가능하다.

참고

profile
더 성장하자.

0개의 댓글