해당 포스트는 나도코딩의 자바 클래스를 참조하여 작성하였다.

https://opentutorials.org/course/1223/5400

 

클래스와 인스턴스 그리고 객체 - 생활코딩

클래스와 인스턴스 이전의 프로그래밍 객체를 만들기 전에 이미 익숙한 코드로 돌아가보자. 아래 예제는 간단한 더하기 프로그램이이다. 그런데 이 예제를 잘 활용하기 위해서는 상상력이 필요

opentutorials.org

 

클래스와 인스턴스, 객체의 개념을 이해하기 위해 예시 코드를 작성하였다.

 

class Plus_Calculate{
	int a, b;
	
	public Plus_Calculate(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	public int re_result() {
		return a + b;
	}
}

public class Main {
	
	public static void main(String[] args) {
		Plus_Calculate pluscalculate = new Plus_Calculate(10, 20);
		int result = pluscalculate.re_result();
		
		System.out.println(result);
	}
}

 

두 수를 더하는 자바 코드이다.

 

 

클래스

 

해당 코드에서는 두개의 클래스가 작성되었는데 두 수를 매개변수로 받아 더하는 로직을 가진 Plus_Calculate 클래스와 실행 시 직접 실행되는 Main 메소드가 담긴 Public Main 클래스가 있다.

 

우선 Plus_Calculate 클래스를 주목해보면 해당 클래스 아래 생성자와 re_result 메소드가 존재함을 확인할 수 있다.

 

생성자는 해당 클래스를 초기화 하는 역할을 하고 있으며, 메소드는 클래스에서 기능을 구현하는 역할을 맡고 있다.

 

해당 이해로 다시 Plus_Calculate 클래스를 확인해보자.

생성자에서 두 변수를 매개변수로 받고 초기화하였으며, re_result 메소드를 통해 두 변수를 더해 반환하는 역할을 하고있다.

 

 

 

인스턴스

 

클래스를 만들었으면 해당 클래스를 사용하기 위해 인스턴스를 생성해야 한다.

 

클래스와 인스턴스를 이해하기 위해 비유를 해보자면 클래스는 빵을 만들기 위한 틀이며, 인스턴스는 빵이라고 할 수 있다.

클래스를 통해 여러 인스턴스를 찍어낼 수 있기 때문이다.

 

인스턴스를 생성하는 방법은 다음과 같다.

<class명> <생성 할 인스턴스 이름> = new <class명>()
Plus_Calculate pluscalculate = new Plus_Calculate(10, 20);

 

위 코드는 pluscalculate라는 변수에 인스턴스를 저장하고 매개변수로 10과 20을 전달한다.

마찬가지로 다른 인스턴스를 생성하려면 변수명을 다르게 하여 생성하면 되는데, 이는 인스턴스를 제어하기 위해서다.

 

그렇다면 pluscalculate의 데이터 타입은 무엇일까?

 

정답은 해당 인스턴스를 생성한 클래스이다.

pluscalculate의 데이터 타입은 Plus_Calculate가 된다는 말이다.

 

 

 

this

 

class Plus_Calculate{
	int a, b;
	
	public Plus_Calculate(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	public int re_result() {
		return a + b;
	}
}

 

위 클래스에서 사용된 this는 무엇일까?

 

클래스에서 생성된 변수 a와 b, 그리고 매개변수로 받은 a, b 모두 이름과 데이터 타입이 동일하다.

 

우선, this는 클래스 내에서 만들어진 필드를 가르킨다. 

그렇기에 이름이 같은 변수를 구분하기 위해 사용하며 this.a는 클래스 안에 생성된 a를 가르키며 this.b도 마찬가지다.

 

그렇게 this를 사용하면 이름이 같은 변수끼리의 초기화가 가능해진다.

 

 

 

static

 

static은 정적변수와 정적 메소드를 작성할 때 사용한다.

 

1) 정적 변수

class Plus_Calculate{
	int a, b;
	static double PI = 3.14;
	
	public Plus_Calculate(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	public int re_result() {
		return a + b;
	}
}

 

정적 변수를 선언하는 방법은 다음과 같다.

<static> <자료형> <변수명> = <값>
static double PI = 3.14;

 

정적 변수는 해당 클래스로 생성된 인스턴스 모두가 공유하는 변수이다.

 

그렇기에 모든 인스턴스가 공유하는 값이 필요할 때 사용한다.

정적 변수에 접근하는 방법은 다음과 같다.

//1. 인스턴스를 통해 접근
System.out.println(pluscalculate.PI);

//2. 클래스를 통해 접근
System.out.println(Plus_Calculate.PI);

 

두번째 방식은 인스턴스를 사용하지 않고 클래스에서 직접 호출하므로 객체를 생성하지 않고도 사용할 수 있다.

 

 

2) 정적 메소드

class Plus_Calculate{
	int a, b;
	static double PI = 3.14;
	
	public Plus_Calculate(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	public int re_result() {
		return a + b;
	}
	//정적 메소드 생성
	public static int avg_result(int a, int b) {
		return (a + b) / 2;
	}
}

public class Main {
	
	public static void main(String[] args) {
		Plus_Calculate pluscalculate = new Plus_Calculate(10, 20);
		int result = pluscalculate.re_result();
		
		System.out.println(result);
		//정적 메소드를 출력
		System.out.println(Plus_Calculate.avg_result(10, 20));
	}
}

 

정적 메소드를 설명하기 위해 예시 코드에서 정적 메소드를 생성하고 이를 출력하는 코드를 추가하였다.

 

마찬가지로 일반 메소드를 작성하는 방식에 static을 붙여주면 되는데 호출하는 방법은 유의해야 할 필요가 있다.

정적 변수는 인스턴스와 클래스를 통해 모두 접근 가능했지만 정적 메소드는 클래스를 통해서만 접근할 수 있다.

 

정적 변수는 인스턴스가 만들어지며 생성되는데 정적 메소드는 인스턴스가 만들어지기 전에 생성되기에 접근할 수 없는 것이다.

System.out.println(Plus_Calculate.avg_result(10, 20));

 

그래서 위처럼 정적 메소드를 호출할 땐 클래스를 통해서 호출하였다.