JAVA

자바 객체 지향 기본 동작 원리 (클래스, 인스턴스, 객체) - 공부하는 도비

DOVISH WISDOM 2022. 3. 4. 13:56  
728x90
반응형

자바는 객체지향 언어로 알려져 있습니다. 

객체지향 기능을 사용하지 않고도 프로그램을 작성할 수 있지만, 가독성 좋고 실용적인 코드는 작성할 수 없습니다.

 

오늘 피드에서는 왜 객체지향이라는 게 필요한지와 그와 관련된 용어 정리를 해보겠습니다.

 

이전 피드에서는 메소드의 중요성과 필요성에 대해서 설명했습니다. 메소드에 대해 궁금하신 분들은 아래 링크를 따라가 주세요~! 

2022.03.03 - [자바] - [자바] 메소드(method) - 공부하는 도비

 

[자바] 메소드(method) - 공부하는 도비

프로그램을 작성하다 보면 특정 연산을 중복해서 여러 번 사용할 때도 있습니다. 예를 들어, '+, -, *, /' 연산을 해주는 코드가 3번 필요하다면, 아래 코드처럼 비 효율적인 방법으로 실행해야 합

yang-wistory1009.tistory.com

 

코드에서 중복된 연산을 줄이고, 코드를 조금 더 간략하게 보이기 위해서 메소드를 쓴다고 했었습니다. 

메소드가 있는데  왜 굳이 객체 지향을 배워야 할까?라는 궁금증이 생길 수 도 있습니다.

메소드는 어떤 특정한 기능을 정의한 것을 의미하는데, 그 기능이 많으면 많아질수록 메소드의 개수도 늘고 유지보수가 힘들어진다는 단점이 있습니다. 

 

아래 코드를 보면, left, right 변수를 사용하여 sum(left, right), avg(left, right)를 계산하고 있기 때문에 서로 연관되어 있고, 이렇게 연관되어 있는 연산이 총 두 번 중복되어 있습니다.

이 코드만 봤을때는, 메소드가 있으면 객체 지향을 배우지 않아도 되겠는걸?이라는 생각을 할 수도 있습니다.

하지만, 만약 선언된 int left, right와 sum(left, right)의 거리가 굉장히 멀고, 다른 사용자가 이 코드를 봤을 때, right라는 뜻을 권리라고 해석할 수도 있기 때문에, 코드의 모호성과 유지 보수에서의 문제점이 발생합니다. 

 

또한, 정의된 left, right 변수를 이용해서 sum과 avg가 아닌 다른 기능을 추가하고 싶을 때는 메소드의 개수를 계속해서 추가해야 합니다. 

 

이제, 동일한 결과를 내는 객체 지향 코드를 작성해보겠습니다. 

- Calculator c1;

: main 에서 Calculator라는 사용자 정의 데이터 타입을 생성하고, c1이라는 객체를 만들어 주었습니다. 

 ( 이 말은 int i; 처럼 사용자가 지정하는 타입의 변수를 하나 만들었다고 생각하시면 됩니다. )

 

- c1 = new Calculator() 

: 코드 제일 위에 선언된 Calculator 클래스의 설계도면을 생성하고, c1 객체에 담아주었습니다. 

 ( 객체가 클래스를 통해 구체적인 실체가 되면 그것을 인스턴스라고 부릅니다. )

 

① 10, 20 매개변수로 전달 : Calculator 클래스를 보면, setNumbers라고 하는 메소드에 매개변수로 값을 받고 있습니다. 앞에서 선언한 Calculator의 객체 c1에 setNumbers을 사용하여 데이터를 넘겨주겠습니다. 

 

② 매개변수 값을 선언한 클래스에서 정의한 동일한 변수명에 전달 

 

③ this라고 하는건 Calculator 객체 c1을 가리키는 것이고, 이는 Calculator 클래스 내부에서 main으로 부터 넘겨받은 데이터를 사용하겠다는 뜻입니다. 

 

( Calculator class를 형광 박스의 순서대로 보면 이해가 더 쉽습니다. )

 

 이렇게 해서 가장 기본적인 객체지향 동작 원리를 알아보았습니다. 

 

전체 코드

package test_java;

class Calculator{
	int a, b;
	
	public void setNumbers(int left, int right) {
		
		this.a = left;
		this.b = right;

	}
	public void sum() {
		System.out.println(this.a + this.b);
	}
	public void avg() {
		System.out.println((this.a + this.b)/2);
	}
}

public class test {
	
	public static void main(String[] args) {
		
		Calculator c1; 			
		c1 = new Calculator();	
								
		c1.setNumbers(10,20);
		c1.sum();
		c1.avg();
		
		
		Calculator c2 = new Calculator();
		c2.setNumbers(20,40);
		c2.sum();
		c2.avg();

		
	}
}