본문 바로가기
BackEnd/Java

[Java] 객체지향프로그래밍 OOP*

by summer_light 2021. 7. 1.

객체지향프로그래밍

Object Oriented Programming

 

 


객체지향 vs 절차지향

객체지향

객체를 만들어서 순서에 연연하지 않고 자주 쓰거나 필요한 부품은 따로 정의하여 모듈화 하는 등의 장점을 가진 기법이다. 객체의 호출 순서에만 영향을 받는다.

 

 

절차지향

하나의 로직을 순서대로 진행하여 처리하는 기법이다. 

 

 


객체지향프로그래밍의 특징

  1. 캡슐화 
    • 캡슐화 = 보안 = 보호
    • 관련된 데이터(필드)와 기능(메소드)이 하나의 묶음으로 관리된다.
  2. 상속
    • 이미 작성된 부모 클래스를 이어받아 새롭게 만드는 것
    • 자식 클래스는 부모 클래스의 모든 속성과 메소드를 사용할 수 있다.
    • 부모 클래스에 없는 기능은 자식 클래스에 추가해 사용한다.
  3. 추상화
    • 실제 객체를 인스턴스화 할 때, 불필요한 것을 제외하고 필요한 것만 유지한다.
  4. 다형성
    • 파라미터나 상황에 따라 객체의 동작이 변경되는 것

 

 

 


객체, 클래스, 인스턴스

객체

실생활에 존재하는 모든 것(개념, 사람, 핸드폰, 컴퓨터...)

- 행동(기능) 메서드 ex. 일한다. 본다. 듣는다.

- 속성(정보) 멤버변수, 상태 ex. 이름, 주소, 직업, 키

 

클래스

객체를 만들기 위한 설계도.

객체를 만들기 위해서는 클래스를 만들어야 한다.

클래스를 참고하여 필요한 부분만 뽑아 객체가 생성된다.

 

인스턴스

클래스로부터 메모리에 생성된 객체를 지칭한다. (인스턴스화)

 

 


객체와 인스턴스

클래스에 의해서 생성된 객체를 인스턴스라고 한다.

 

 

* 객체와 인스턴스의 차이는?

Animal a1 = new Animal();로 a1을 만든다면

a1은 객체

a1 객체는 Animal의 인스턴스이다.

즉 인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지를 관계위주로 설명할 때 사용한다.

즉, 'a1은 인스턴스'보다는 'a1은 객체',

'a1은 Animal의 객체' 보다는 'a1은 Animal의 인스턴스'

와 같이 표현하는 것이 자연스럽다.

 

 


클래스와 인스턴스

과자를 만드는 과자틀과 만들어진 과자가 있다면,

과자틀 : 클래스

과자: 객체, 인스턴스

 

 


지역 변수 vs 인스턴스 변수

인스턴스 변수

멤버변수라고도 한다.

클래스 바디에 생성된다.

직접 초기화 하지 않아도 자바가 자동으로 초기값을 넣어준다.

- 숫자형 변수이면 0으로 처리되고, (정수형: 0, 실수형: 0.0, 문자형: 0, 논리형: false)

- 참조형 변수(ex. String)이면 null으로 처리된다.

 

지역 변수

메소드 괄호{ } 안에서 선언

괄호가 닫히면 사라진다.

사용하기 전에 초기화 해야 함

 

 


예제01. 객체 만들고 사용해보기

  • 클래스 안, 메인 함수 전 : 변수 선언(인스턴스 변수)
  • 클래스 안, 메인 함수 후 : 메소드 선언
  • 클래스 바깥 : 다른 클래스를 만든다.

다음과 같이 main 함수 바깥에 OOP01 클래스의 메소드들을 만들고, 

main 함수 안에서 OOP01의 인스턴스인 oop01 을 이용해서 OOP01의 메소드를 호출할 수 있다.

 

※ 생성자 메소드

생성자 메소드는 대문자로 시작하는 이름( ) 형태이므로, 생성자 메소드임을 바로 알 수 있다.

비교) 일반 메소드: 소문자로 시작하는 이름( ) 

package jun01;

public class OOP01 {
	int number;
	//클래스 안, 메인 함수 전 : 변수선언(인스턴스 변수)

	public static void main(String[] args) {
		int app = 0;
		System.out.println(app);
		
		OOP01 oop01 = new OOP01();//생성자 메소드, 대문자로 시작하고() 형태이면 생성자 메소드 
		oop01.print2(); //점 = 소유, oop01의 메소드 호출 
		System.out.println(oop01.number);//0
		oop01.number = 1000;
		System.out.println(oop01.number);//1000
		
		Apple apple = new Apple();
		apple.print();
		
		//다른 메소드를 실행시키기 위해서 호출하기
		
	}

	//클래스 안, 메인 함수 후 : 메소드를 만들고, 그 속에 코드를 적는다.
	void print2() {
		System.out.println("실제 코드가 여기 들어갑니다.");
	}
	
	int print3() {
		return 0;
	}
	
	String print() {
		return "Hello";
	}
}

//클래스 끝 : 클래스를 만들고, 메소드를 만들고, 그 속에 코드를 적는다.
class Apple{//class
	public void print() {//method
		System.out.println("실제 코드가 여기 들어갑니다.");//code
	}
}

 

 

예제 02. 다른 패키지의 객체 사용하기 

※ 클래스 이름 중복 가능

같은 클래스 이름이지만, 다른 패키지의 클래스 이므로 다르게 취급된다.

경로는 좌변 뿐 아니라 우변에서도 명시해주어야 한다.

  • Apple apple = new Apple();
    경로를 표현 안 하는 경우, 현재 패키지 속의 Apple 클래스
    그런데 import apple.Apple; 가 있는 경우 현재 패키지 속의 Apple 이 아닌 apple패키지의 Apple이 불러와졌다.
  • apple.Apple a1 = new apple.Apple();
    → apple 패키지 속의 Apple 클래스 
  • com.poseidon.apple.Apple s2 = new com.poseidon.apple.Apple();
    → com.poseidon.apple 패키지 속의 Apple 클래스
package jun01;

class NoteBook {
	String game;
	String power;
	int memory = 1024;
	
	void runGame() {
		System.out.println(game + "을 실행합니다.");
	}
	
	void power(String stats) {//stats : 가상변수
		System.out.println("노트북 : " + stats);
	}
	
	int addMemory(int memory) {//지역 가상 변수
		memory += this.memory;//인스턴스 변수. this: '현재 class의'
		return memory;
	}
	
}

public class OOP02 {
	public static void main(String[] args) {
		
		//클래스에서 인스턴스 생성하기
		NoteBook lg = new NoteBook();
		
		lg.power("On");
		lg.game = "diablo4";
		lg.runGame();
		int result = lg.addMemory(1024);
		System.out.println("1024를 추가하면 " + result + "가 됩니다.");
		
		NoteBook ss = new NoteBook();
		lg.memory += 2048;
		System.out.println(lg.memory);
		System.out.println(ss.memory);
		System.out.println(ss.game);
		
		Apple apple = new Apple(); //현재 패키지 속의 Apple 클래스
		apple.Apple a1 = new apple.Apple(); //apple 패키지 속의 Apple 클래스 
		com.poseidon.apple.Apple s2 = new com.poseidon.apple.Apple(); //com.poseidon.apple 패키지 속의 Apple 클래스
		
	}	
}

 

 

 

예제03. 사과 구매/판매 프로그램

  • Main 
  • AppleSeller (정보 - 기능 - 결과출력)
  • AppleBuyer  (정보 - 기능 - 결과출력)

Main

package apple;

public class Main {
	public static void main(String[] args) {
		
		AppleSeller appleSeller = new AppleSeller();
		AppleBuyer appleBuyer = new AppleBuyer();
		
		appleBuyer.buyApple(appleSeller, 3000);
		
		appleBuyer.buyerInfo();
		appleSeller.sellerInfo();
		
		
	}
}

 

AppleSeller

package apple;

public class AppleSeller {
	
	//정보
	//사과의 수
	int appleCount = 50;
	//가진 돈
	int sellerMoney = 0;
	//사과의 가격
	final int APPLE_PRICE = 1000; //상수는 대문자로 표현!
	
	
	//기능
	//사과를 파는 행동
	public int sellApple(int money) {
		//1천원을 주면 사과장수가 돈을 가져가고 사과 1개를 줌
		int number = money / APPLE_PRICE;//줄 사과의 수
		//내꺼 사과에서 -
		appleCount -= number;
		//돈은 내것에 + 
		sellerMoney += money;
		return number;
        
	}
	
	//자신의 정보를 말하는 행동
	public void sellerInfo() {
		System.out.println("남은 사과는 " + appleCount + "개 입니다.");
		System.out.println("수익은 " + sellerMoney +"원 입니다.");
        
	}
	
}

 

AppleBuyer

  • 구매자가 사과를 구매할 때, 어떤 판매자의 사과를 샀는지에 따라 어떤 판매자의 사과 갯수가 줄어들지가 달라진다. 그러므로 buyApple 메소드에 AppleSeller의 인스턴스를 입력으로 받아야 한다. 
package apple;

public class AppleBuyer {
	
	//정보
	//가지고 있는 돈
	int buyerMoney = 5000;
	//가지고 있는 사과의 수
	int countApple;
	
	//기능
	//사는 행동
	public void buyApple(AppleSeller as, int money) {
		//돈을 주고 사과를 받아야 함
		int num = as.sellApple(money);
		countApple += num;
		buyerMoney -= money;
	
	}
	
	//결과 말하기
	public void buyerInfo() {
		System.out.println("가진 돈은 " + buyerMoney + "원 입니다.");
		System.out.println("가진 사과는 " + countApple + "개 입니다.");
	}
    
}

 

예제04. 호감도 

david.ask(); sunja.answer(); 보다 david.ask(sunja)가 뭐가 좋지?

package jun02;

class David {
	int lovePoint = 10;

	void ask(Sunja s) {
		System.out.println("You, 나 사랑해?");
		s.answer();
		lovePoint++;
	}
}

class Sunja {
	int lovePoint = 60;

	void answer() {
		if (lovePoint > 50) {
			System.out.println("사랑해");
		} else {
			System.out.println("사랑 안 해.");
		}
		lovePoint--;
	}
}

public class OOP07 {
	public static void main(String[] args) {

		David david = new David();
		Sunja sunja = new Sunja();
		
		for (int i = 0; i < 15; i++) {
			//david.ask();
			//sunja.answer();
			david.ask(sunja);
		}
		
		
	}
}

 

예제05. 무한으로 더하기

파라미터가 매우 많은 경우 int... 와 같이 ...으로 표현할 수 있다. 

package jun02;

public class OOP05 {
	
	public static void main(String[] args) {
		OOP05 o05 = new OOP05();
		o05.plus(2,3,4,5,6,7,8,9,1,2,3,4,3,2,1,2,54);
		
	}
    
    //만약 무한으로 들어온다면?
	public void plus(int... is) {
		int result = 0;
		for (int i = 0; i < is.length; i++) {
			result += is[i];
		}
		System.out.println(result);
	}
	
}

 

예제 06. main 메소드에서 args[ ] 사용하기

※ 이클립스에서 args 배열에 값을 넣는 방법

eclipse 에서 args 배열에 값을 넣기 위해선 Run▼ - Run Configurations 을 클릭하고

Arguments 탭에서 Program arguments: 부분에 차례대로 값을 적어넣으면

띄어쓰기를 기준으로 args[0], args[1].... 순서로 값이 들어가게 된다.

main 메소드에서 args[ ] 사용하기

package jun03;

public class OOP08 {
	public static void main(String[] args) { //사과 배 포도
		
		if (args[0].equals("사과")) {
			System.out.println("사과라고 입력했습니다.");
		}
		
		for (int i = 0; i < args.length; i++) {
			System.out.println(args[i]);
		}
		
	}
}

출력결과

사과라고 입력했습니다.
사과

포도

 

이렇게 코드 상에서는 args[0] 을 지정해준 것 같지 않아 보이지만, 정상적으로 작동 된다.

'BackEnd > Java' 카테고리의 다른 글

[Java] 스태틱 Static  (0) 2021.07.01
[Java] 오버라이드, 오버로드  (0) 2021.07.01
[Java] 동적가변배열 Dynamic Array  (0) 2021.07.01
[Java] 날짜 형식 Date Format  (0) 2021.07.01
[Java] 문자(Character), 문자열(String)  (0) 2021.07.01

댓글