자바 객체지향 개념

728x90

객체지향

정의:

객체지향이란 각각의 기능에 맞게 클래스들을 생성하여 프로그램의 기능을 구현하기 쉽게 만들고 나중에 유지보수나 재사용을 쉽게 가능하게 만들어주는 것.

 

각각의 클래스들을 만들때 필드(멤버변수 IV), 생성자, 메서드(행동, 기능)들을 만들어준다.

 

사과 판매를 예시로 하여 설명하였는데 필드, 생성자, 메서드를 아래와 같이 선언해준다.

판매자의 입장에서 필요한 멤버변수는 (1)개당 이윤과 (2)현재 사과의 잔고 (3) 사과 단가이기 때문에 필드에 3개의 변수를 선언했다.

  • 필드는 그 클래스의 기능에 필요한 멤버변수를 선언한다
public class Mart {
//	field
	int benefit; // 이윤
	int applenumber; //사과 잔고
	int appleprice; //사과 단가

 

생성한 3개의 변수의 초기값을 설정해줄때 생성자를 사용한다. 이 때 이윤과 현재 사과 잔고, 그리고 사과 단가를 직접 입력해야하기 때문에 매개변수를 3개를 지정해서 생성자를 생성한다

  • 생성자는 클래스를 선언할 때 그 멤버변수를 어떻게 초기화(값 배정)를 시켜줄 지 선언해준다.
//	생성자
	Mart(int bf, int num, int price){
		benefit = bf;
		applenumber = num;
		appleprice = price;
	}

 

판매자의 입장에서 현재 멤버변수인 applenumber(사과잔고)를 변경하기위한 행동은 사과를 파는 것이기 때문에 saleApple이라는 메서드(행동)을 만들어준다.

  • 메서드를 생성할 때 필드의 값이 언제 변화하는지 생각하여 구현하고 어떻게 필드값이 변화하는지 구현하면 된다
    • 메서드 요약:
      1. 입력된 가격이 현재 사과 단가보다 높거나 사과 잔고가 0 이상일 시 사과 잔고에서 구매된 사과 개수를 뺌
      2. return으로 구매된 사과 개수의 값을 도출
//	메서드 - 기능/동작(사물), 행위(사람)
//	필드의 값이 언제 변화가 일어나는지 생각하여 메서드를 작성
//	예를 들어 판매자 입장에서는 사과를 판매할 때 필드의 값이 변경되므로 메서드는 사과 판매 기능을 넣어주면 됨
	public int saleApple(int cost) {
//		각각 구매자마다 원하는 사과 개수가 다르므로 받은 금액만큼 사과를 주는 매개변수를 넣음
		if(cost >= appleprice && applenumber>=0) {
			applenumber -= cost/appleprice;
			return cost/appleprice;
		}
		else {
			return 0;
		}
	}

 

 

메서드 추가 이해본

아래의 메서드 buy를 보면 매개변수에 Mart를 선언하였는데 그 이유는 아래와 같다.

  • 아래 메인 클래스에 Mart를 선언하여 주소값 값을 지정한 후에 그 값을 가지고 계산을 해야하기 때문에 해당 객체의 주소값을 선언해야 한다
	public static void main(String[] args) {

		Mart m = new Mart(0,5,1000);
		Buyer me = new Buyer(5000);
		me.buy(2000, m);

    • 따라서 Buyer라는 클래스의 메서드buy에 매개변수로 Mart를 지정하여 위의 주소값(0,5,1000)을 불러와서 그 값을 가지고 계산을 한다.
    • 위의 Mart 클래스의 saleApple메서드에서 return받은 값을 가지고 numofapple의 변수 값에 더해주어 메서드를 마무리 한다
      • 위에서 void 가 아닌 int return 값으로 지정한 이유가 바로 이것! void로 실행하면 값을 저장하지 않고 실행만 하여 출력하기 때문에 값을 불러올 수 없다.
      • 따라서 이렇게 값을 저장하여 계속 사용할 경우에는 return을 사용하고 실행만 하여 결과값이 필요할 경우는 void를 사용한다.
public class Buyer{ //참조 자료형(판매자)
	
//	field
	int myMoney;
	int numofApple; //사과 구매 개수
	
//	생성자
//	생성자를 생성하면 위의 기본값을 어떤 새로운 값으로 넣어줄 때 그 값이 overriding 되어 새로운 값으로 출력됨
	Buyer(int money){
		myMoney = money;
		
	}
	
//	메서드 - 기능/동작(사물), 행위(사람)
//	아래 메서드 매개변수를 객체로 넣으면 그 객체의 주소를 받아와서 먼저 선언한 mart의 값으로 계산을 하는것이라고 볼 수 있음
	public void buy(int money, Mart mart) {
		numofApple += mart.saleApple(money);
//		mart.applenumber -= numofApple;
//		여기서 왜 보유사과가 2배로 빠지나 했더니 그 이유는 saleApple 메서드에 이미 같은 코드가 중복작성되어있어
//		두번이나 빠지는 것이였다. 이 문제를 강사님이 그리시는 대로 맵핑하여 따라가다 보니 문제를 찾을 수 있었다.
//		여기서 이 메서드같은 경우는 int값 4바이트의 mart 클래스의 주소 값을 받아 그 값으로 buy메서드의 금액을
//		cost 매개변수로 가져가서 applenumber의 값을 계산한 후 return값인 cost/appleprice의 값을 가져온 것이다.
//		총 4개의 값을 가져와서 현재 보유 사과로 넣어주고 남은 사과 개수는 전에 계산한대로 4개가 빠진 총 16개가 출력된다.
		myMoney -= money;
	}

 

객체 초기화 방법

아래처럼 객체 선언 후에 null로 입력하면 초기화가 되지만 오류가 발생한다. 왜냐!

  • 객체 선언의 이름 후 그 객체의 메서드나 멤버변수를 넣으면 컴파일 시 그 객체를 어떻게 실행해야할지 모르므로 오류 발생
	public static void main(String[] args) {
		Mart m2 = null;
		Buyer me2 = null;
		me2.buy(2000, m);
        //.을 넣어 그 메서드로 가야하는데 null 값이기 때문에 어디로 가야할지 모르겠다는 오류
		me2.showBuyer();

제목1 

본문

public class Buyer{ //참조 자료형(판매자)
	
//	field
	int myMoney;
	int numofApple; //사과 구매 개수
	
//	생성자
//	생성자를 생성하면 위의 기본값을 어떤 새로운 값으로 넣어줄 때 그 값이 overriding 되어 새로운 값으로 출력됨
	Buyer(int money){
		myMoney = money;
		
	}
	
//	메서드 - 기능/동작(사물), 행위(사람)
//	아래 메서드 매개변수를 객체로 넣으면 그 객체의 주소를 받아와서 먼저 선언한 mart의 값으로 계산을 하는것이라고 볼 수 있음
	public void buy(int money, Mart mart) {
		numofApple += mart.saleApple(money);
//		mart.applenumber -= numofApple;
//		여기서 왜 보유사과가 2배로 빠지나 했더니 그 이유는 saleApple 메서드에 이미 같은 코드가 중복작성되어있어
//		두번이나 빠지는 것이였다. 이 문제를 강사님이 그리시는 대로 맵핑하여 따라가다 보니 문제를 찾을 수 있었다.
//		여기서 이 메서드같은 경우는 int값 4바이트의 mart 클래스의 주소 값을 받아 그 값으로 buy메서드의 금액을
//		cost 매개변수로 가져가서 applenumber의 값을 계산한 후 return값인 cost/appleprice의 값을 가져온 것이다.
//		총 4개의 값을 가져와서 현재 보유 사과로 넣어주고 남은 사과 개수는 전에 계산한대로 4개가 빠진 총 16개가 출력된다.
		myMoney -= money;
	}

제목1 

본문

수정용
728x90