본문 바로가기

생활코딩/JAVA1

생활코딩) JAVA - 14.10. 나의 앱 만들기 - 클래스

https://youtu.be/l8hrA4VSIlA

 

우리가 메소드 라는 것을 살펴봤습니다. 메쏘드는 서로 연관된 코드를 정리 정돈하는 상자다 라고 말씀드렸죠. 그 다음에 여러분 매소드를 할 줄 알면 이제 오브젝트 객체라는 것을 공부할 수 있는 준비가 된겁니다. 그 악명 높은 객체지향에 들어갈 수 있는 준비가 되신 건데요. 당연히 처음부터 객체지향을 여러분들이 구사해야 되는거 아닙니다.

하지만 이제 여러분이 사용하게 될 많은 라이브러리들이 객체지향 방법으로 만들어져 있기 때문에 객체지향이 뭔 지 정도 인상 정도는
가지고 있을 필요가 있습니다. 

자 그래서 우리 메소드에서 객체로 넘어 갈 건데요. 자 한번 따라 해 보시죠. 객체는 클래스 라는 표현을 쓰기도 하거든요. 같은 내용은 아닌데 클래스는 서로 연관된 변수와 메소드를 그룹핑한 것이다. 그리고 거기에 이름을 붙인 것이다. 역시나 정리정돈의 상자이다 라는 겁니다. 그래서 이 메쏘드 또 클래스 이런 것들이 중요한 이유는 우리가 소프트웨어를 만들어 가는데 있어서 구조를 결정하기 때문에 중요합니다. 마치 우리 신체에서 뼈대와 같은 역할을 하는 것이 메소드와 클래스 이기 때문에 상당히 뒤로 갈수록 중요해지는 내용이긴 합니다. 자 그러면 우리의 프로젝트에 어떤 부분이 도대체 불만족스럽길래 클래스 라는 것이 도입될 필요가 생기는가 라는 것을 살펴 봅시다.

 

우리가 이전 시간에 그 짰던 코드 AccountingMethodApp을 전원 복사해서 메소드가 아니라 클래스 앱으로 이름을 개명하겠습니다. 자 그리고 클래스 앱을 연 다음에 이름을 이렇게 바꿔 줍니다. 그 다음에 여기 아 Outline이라는 게 있거든요. 걔가 안보이시는 분들은 이클립스에서 윈도우 쇼 뷰에서 음 Outline이라는 것을 선택하시면 됩니다. 이건 뭐냐면 이 클래스 안에 소속되어 있는 여러가지 멤버들 멤버라는 것은 그 클래스 소속의 변수, 또 메소드를 멤버라고 포괄적으로 얘기합니다. 그 멤버들의 리스트를 보여줍니다.  보시면은
지금 AccountingClassApp이라는 우리의 그 클래스 우리의 실행프로그램 에는 여러가지 변수들과  여러가지 메소드 들이 존재합니다. 그 모습을 보여주는 거예요. 그런데 여기에는 어카운팅 즉 회계와 관련된 메쏘드만 존재합니다만 자 상상력을 발휘해서 여기에 회계와 상관없는 다른  메쏘드와 변수가 있을 수도 있겠죠.

 

	public static void main(String[] args) {
		
		Accounting.valueofSupply = 10000.0;
		Accounting.vatRate = 0.1;
		Accounting.expenseRate = 0.3;
		Accounting.print();
		// anotherVariable = ...;
		// anotherMEthod = ...;
	}

anotherVariable = ...; 가 있을 수 있고 anotherMEthod = ...;가 있을 수 있겠죠. 무슨 말인지 아시겠어요. 자 여기 있는 것들은 뭐예요. 이거는 돈 계산과 관련된 건데 우리가 짜고 있는 프로그램이 복잡한 프로그램이면 돈 계산후 외에도 다른 취지의 코드들이 막 섞여 있을 거란 말이죠, 그러면 여기에 이제 메소드와 변수가 막 뭐 1억개씩 있게 되면 엉망진창이 되면서 결국에 우리가 프로그램을 만드는 생산성을 급격히 떨어뜨리는 방해요소가 될 수 있단 말이에요. 자 이런 상황에서 우리를 구원해 주는 도구가 뭐냐. 바로 클래스입니다.  이 파일로 치면 디렉토리와 같은 역할을 하는 것이 클래스 인데요.

 

class Accounting 이라는 클래스를 만들겠습니다. 그리고 저는 여기 있는 저 필드들 변수들을 현재 AccountingClassApp의 소속 인데 class Accounting의 멤버로 바꿉니다. 여기 있는 요 친구들도 class Accounting의 멤버로 이사 시켰어요. 그럼 이제 제가 여기서 어떻게 하면 되냐. 카운트라는 클래스의 이름을 앞에 붙여주면 이전과 똑같이 동작하는 코드를, 하지만 구조는 완전히 달라진 코드를 만들 수 있게 됩니다.

 

class Accounting{
	public static double valueofSupply;
	public static double vatRate;
	public static double expenseRate;
	
	private static void print() {
		System.out.println("Value of Supply : "+valueofSupply);	
		System.out.println("VAT : "+ getVAT());
		System.out.println("Total : "+ getTotal() );
		System.out.println("Expense : "+ getExpense() );
		System.out.println("Income : "+ getIncome());
		System.out.println("Dividend: "+ getDividend1());
		System.out.println("Dividend: "+ getDividend2());
		System.out.println("Dividend: "+ getDividend3());
	}
	private static double getDividend3() {
		return getIncome() * 0.2;
	}
	
	private static double getDividend2() {
		return getIncome() * 0.3;
	}
	
	private static double getDividend1() {
		return getIncome() * 0.5;
	}

	private static double getIncome() {
		return valueofSupply - getExpense();
	}

	private static double getExpense() {
		return valueofSupply*expenseRate;
	}

	private static double getTotal() {
		return valueofSupply + getVAT();
	}

	private static double getVAT() {
		return valueofSupply*vatRate;
	}

}
public class AccountingClassApp {

	public static void main(String[] args) {
		
		Accounting.valueofSupply = 10000.0;
		Accounting.vatRate = 0.1;
		Accounting.expenseRate = 0.3;
		Accounting.print();
		// anotherVariable = ...;
		// anotherMEthod = ...;
	}
	
}	


결과는 완전히 같아요. 하지만 이렇게 AccountingApp 에 속해있는 ValueOfSupply, print라는 것을 분명히 함으로써 그 소속과 한계를 명확히 할 수 있게 된 겁니다. 그럼 이제 다른 취지의 코드들과 막 뒤섞여 도 상관 없고 또 프린트와 같이 흔한 이름의 메소드를 사용해도 같은 이름의 메소드들이 공존할 수 있게 되는 겁니다. 클래스만 다르다면요. 자 이것이 바로 객체지향의 핵심이라고 할 수 있는 클래스입니다.

 

 

자 이렇게 해서 우리 클래스에 대한 얘기도 여기까지 하겠습니다. 전 시간에 우리가 클래스를 통해서 우리 애플리케이션을 또 개선하는 모습을 보여드렸습니다. 참 끝이 없죠 예 근데 이렇게 이렇게 얼마 안되는 코드를 이렇게 복잡한 체계를 쓰지 않아요. 여러분 오해하지 마십시오. 그래서 하지만 이제 중급자가 되면 작은 코드에 요런 체계를 쓰는 것이 그렇게 비경제적이지 않죠. 왜냐면 크게 익숙하니까요. 그런 분들은 그렇게 하겠지만 초심자 한테는 전혀 경제성이 없는 일입니다. 그러니까 나중에 내가 중급자가 되면 요런걸 쓰겠구나. 이렇게 생각해 주시기 바랍니다. 자 아무튼 객체지향에서 클래스라는 것이 있구요. 또 하나는 인스턴스 라고 하는 개념이 있어요. 자 인스턴스는 이런 느낌으로 생각해주세요.

 


------

* 유튜브 강의에서 자막을 추출해 정리했습니다.

-----

 

* 클래스는 서로 연관된 변수와 메소드를 그룹핑한 것이다. 역시 정리정돈의 상자이다. 취지가 다른 코드들과 막 뒤섞여 도 상관 없고 또 프린트와 같이 흔한 이름의 메소드를 사용해도 같은 이름의 메소드들이 공존할 수 있게 되어서 편하다.

 

- 사실 무슨 말인지 잘 모르겠다...................................................................

유튜브 강의 댓글에 어떤 분이 적어놓은 것을 붙여넣기

 

- 여러 다른 종류의 변수/메소드들이 혼재되어 있어도 '클래스 소속'을 밝혀주면 각 멤버들의 성격을 한눈에 파악할 수 있음 - 구현되어있는 변수,메소드들을 메인 스크립트에 다 적어줄 필요 없이, 클래스로 만들어 따로 빼놓고 필요한 부분에 클래스명.변수/메소드 식으로 바로 호출해 쓸 수 있어 편리함.

반응형