-------------------------------------
객체 지향 프로그래밍

1. Object Oriented Programming


2. 절차 지향적 프로그래밍 방식은 데이터를 처리하는 방법에 중심으로 두고, 어떤 방법론으로 처리하는 것이 효과적인지, 효율적인지를 연구했던 방식이다.


3. 객체 지향적 프로그래밍 방식은 데이터 자신을 프로그램 처리의 대상으로 보고, 데이터 자신에게 처리 방법을 포함함으로써 독립적인 처리가 가능하도록 만든 프로그래밍 방법이다.

객체 지향 프로그래밍에서는 데이터가 독립적인 상태가 되도록 하기 위해서 클래스라는 형태로 만들게 된다.

클래스는 속성과 기능을 멤버로 구성하게 된다. 속성은 멤버변수, 기능은 메소드로 표현한다.

프로그램의 대상인 데이터를 클래스로 표현하고, 해당 클래스를 사용 가능한 상태인 인스턴스(객체화)로 만들어서 데이터 처리를 하게 된다.

클래스는 독립적이지만 다른 클래스와 조합을 해서 하나의 큰 프로그램을 운영하게 된다.

 

3. 클래스 기본형식

class 클래스이름 {

 //멤버변수
 private 자료형 변수명;
 //멤버변수를 위한 getter, setter 메소드 등록
 public void set변수명(외부 데이터) {
  this.변수명 = 외부 데이터;
 }
 public 자료형 get변수명() {
  return this.변수명;
 }

 //메소드
 public 자료형 메소드이름(매개변수) {
  //액션 코드
 }

}


4. 클래스(class)를 사용하려면 객체화 시켜야 한다. 클래스가 객체화된 상태를 인스턴스(instance)라고 한다. 인스턴스로 만들어진 클래스는 참조주소를 통해서 접근하게 된다.

 클래스이름 변수 = new 클래스이름();

형태의 명령을 이용해서 인스턴스를 생성한다.

클래스는 사용자가 인스턴스 생성 명령을 실행할 때마다 메모리에 독립적인 인스턴스가 생성된다. 각각의 인스턴스는 메모리 내에서는 독립적인 상태가 된다.

 

//Printer.java
package com.test;

public class Printer {
 
 private int ink = 0;
 
 public void setInk(int ink) {
  this.ink = ink;
 }
 
 public void print(String msg) {
  //인쇄 고유 기능 실행
  if (ink > 0) {
   System.out.println(msg);
   --ink;
  } else {
   System.out.println("잉크가 부족합니다.");
  }
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {

  Printer p = new Printer();
  
  p.print("테스트 인쇄1"); //X
  p.setInk(5);
  p.print("테스트 인쇄2"); //O
  p.print("테스트 인쇄3"); //O
  p.print("테스트 인쇄4"); //O
  p.print("테스트 인쇄5"); //O
  p.print("테스트 인쇄6"); //O
  p.print("테스트 인쇄7"); //X
  
 }

}

 

 

 

예를 들어,
마카보드를 클래스로 표현하려면, 마카보드의 속성과 기능을 분석해야 한다.
마카보드의 속성->색상
마카보드의 기능->쓰기

속성과 기능을 클래스 표현에서 멤버변수와 메소드(getter, setter 포함)로 표현한다.

//MarkerBoard.java
package com.test;

//마커보드 데이터를 클래스로 표현합니다.
public class MarkerBoard {
 
 //멤버변수 - 객체의 속성(상태값 저장용 변수)
 private String color;
 
 //멤버변수와 외부의 의사소통을 위한 전용 메소드
 //getter, setter 메소드 등록
 public void setColor(String color) {
  this.color = color;
 }
 public String getColor() {
  return this.color;
 }
 
 //메소드(기능) 정의
 public void write(String msg) {
  System.out.println(msg);
 }

}

 

마카보드 클래스를 인스턴스로 만들려면 아래와 같이 main() 메소드 내에서 인스턴스 생성 명령을 실행합니다.
//Main.java
package com.test;

import java.awt.Color;

public class Main {

 public static void main(String[] args) {
  
  //클래스에 대한 인스턴스 생성 과정(객체화)
  MarkerBoard mb = new MarkerBoard();
  
  //setter 메소드를 이용한 객체의 상태값 변경
  mb.setColor(Color.red.toString());
  
  //해당 객체의 기능(write) 호출
  mb.write(String.format("객체 지향 프로그래밍 테스트!(%s)"
     , mb.getColor()));

 }

}

 

 

프린터를 클래스로 표현
프린터 속성 -> 잉크, 종이 -> 멤버변수 표현
프린터 기능 -> 인쇄 -> 메소드 표현

//Printer.java
package com.test;

public class Printer {
 
 //멤버변수
 private int ink;
 private int paper;
 
 //getter, setter 메소드 준비
 public int getInk() {
  return this.ink;
 }
 public int getPaper() {
  return this.paper;
 }
 public void setInk(int ink) {
  this.ink = ink;
 }
 public void setPaper(int paper) {
  this.paper = paper;
 }
 
 //잉크 보충 및 종이 보충 메소드
 public void addInk(int ink) {
  this.ink += ink;
 }
 public void addPaper(int paper) {
  this.paper += paper;
 }
 
 //Printer 클래스의 기능 구현
 public void print(String msg) {

  if (this.getInk()>0 && this.getPaper()>0) {

   //메시지 출력
   System.out.println(msg);
   
   //인쇄가 끝나면 잉크(-5)와 종이(-1)를 감소 시키는 과정 진행
   this.setPaper(this.getPaper() - 1);
   this.setInk(this.getInk() - 5);
   
  } else {
   System.out.println(String.format("잉크(%d) 또는 종이(%d)가 부족합니다.", this.getInk(), this.getPaper()));
  }

 }

}

 

 

//Main.java
package com.test;

import java.awt.Color;

public class Main {

 public static void main(String[] args) {
  
  //Printer 클래스에 대한 인스턴스 생성 과정(객체화)
  Printer printer = new Printer();
  printer.setInk(10);
  printer.setPaper(10);
  printer.print("테스트 인쇄1!");
  printer.print("테스트 인쇄2!");
  
  //printer.addInk(5);
  printer.print("테스트 인쇄3!");

 }

}

 

 

 

//LEDTV01.java
package com.test;

public class LEDTV01 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 
 //멤버변수
 //클래스의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 
 //멤버변수를 위한 전용 메소드 -> getter
 //getter를 이용하면 멤버변수의 현재 값을 외부에 노출시킬 수 있다.
 public int getVolumn() {
  return volumn;
 }
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 public void volumnUp() {
  ++volumn;
 }
 public void volumnDown() {
  --volumn;
 }


}

 

 


//Main01.java
package com.test;

public class Main01 {

 public static void main(String[] args) {
  
  //지역 변수 선언
  //-> 초기화 생략
  int a;
  
  //초기화 과정 추가
  a = 0;
  
  //지역 변수의 값 출력->오류
  System.out.println(a);
  
  //클래스에 대한 인스턴스 생성
  LEDTV01 ledTV = new LEDTV01();
  
  //인스턴스를 이용해서 해당 클래스의 메소드를
  //호출할 수 있다.
  //메소드 호출시마다 내부적으로
  //준비된 액션이 실행된다.
  ledTV.volumnUp(); //volumn +1
  ledTV.volumnUp(); //volumn +1
  ledTV.volumnUp(); //volumn +1
  
  //getter 메소드는 해당 클래스의 상태를
  //보여주는 멤버변수의 값을 보여주기 위한
  //전용 메소드이다.
  System.out.println(ledTV.getVolumn()); //3
  
 }

}

 

 

 

//LEDTV02.java
package com.test;

public class LEDTV02 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 
 //멤버변수
 //객체의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 
 //멤버변수를 위한 전용 메소드 -> getter
 //getter를 이용하면 멤버변수의 현재 값을
 //외부에 노출시킬 수 있다.
 public int getVolumn() {
  return volumn;
 }
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 //볼륨 up, down 액션과 동시에 결과(현재 볼륨 값)를 반환하도록 수정합니다.
 public int volumnUp() {
  ++volumn;
  return getVolumn();
 }
 public int volumnDown() {
  --volumn;
  return getVolumn();
 }


}

 

 

//Main02.java
package com.test;

public class Main02 {

 public static void main(String[] args) {
  
  LEDTV02 ledTV = new LEDTV02();

  //볼륨을 증가시키는 액션과
  //현재 볼륨값을 출력하는 액션을 같이 실행합니다.
  System.out.println(ledTV.volumnUp()); //volumn +1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnUp()); //volumn +1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnUp()); //volumn +1, 반환값 존재->출력 액션

  System.out.println(ledTV.volumnDown()); //volumn -1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnDown()); //volumn -1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnDown()); //volumn -1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnDown()); //X
  


 }

}

 

 

 

//LEDTV03.java
package com.test;

public class LEDTV03 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 
 //멤버변수
 //객체의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 
 //멤버변수를 위한 전용 메소드 -> getter
 //getter를 이용하면 멤버변수의 현재 값을
 //외부에 노출시킬 수 있다.
 public int getVolumn() {
  return volumn;
 }
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 //볼륨 up, down 액션과 동시에 결과(현재 볼륨 값)를 반환하도록 수정합니다.
 //볼륨의 범위는 0~10으로 한정시키는 과정 추가
 public int volumnUp() {
  if (volumn < 10) {
   ++volumn;
  }
  return getVolumn();
 }
 public int volumnDown() {
  if (volumn > 0) {
   --volumn;
  }
  return getVolumn();
 }


}

 

 

//Main03.java
package com.test;

public class Main03 {

 public static void main(String[] args) {
  
  LEDTV03 ledTV = new LEDTV03();
  
  System.out.println(ledTV.volumnUp()); //+1
  System.out.println(ledTV.volumnUp()); //+1
  
  System.out.println(ledTV.volumnDown()); //-1
  System.out.println(ledTV.volumnDown()); //-1
  System.out.println(ledTV.volumnDown()); //-1 -> 0에서 멈춤.

 }

}

 

 

문제) LEDTV 클래스에 볼륨 기능 외에 전원 기능을 추가합니다.
- 전원의 초기값은 off 상태
- 전원on/off 기능 구현
- 전원 on 상태인 경우만 볼륨 up, down 작동

//LEDTV04.java
package com.test;

public class LEDTV04 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 //전원 on, off 기능
 //->power 속성, power() 메소드
 
 //멤버변수
 //객체의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 private boolean power;
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 //볼륨 up, down 액션과 동시에 결과(현재 볼륨 값)를 반환하도록 수정합니다.
 //볼륨의 범위는 0~10으로 한정시키는 과정 추가
 public int volumnUp() {
  if (power) {
   if (volumn < 10) {
    ++volumn;
   }
   return volumn;
  } else {
   return -1;
  }
 }
 public int volumnDown() {
  if (power) {
   if (volumn > 0) {
    --volumn;
   }
   return volumn;
  } else {
   return -1;
  }
 }
 
 public void power() {
  power = !(power);
 }


}

 

 

 

//Main04.java
package com.test;

public class Main04 {

 public static void main(String[] args) {
  
  LEDTV04 ledTV = new LEDTV04();
  int temp;

  //ON 이전
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);

  ledTV.power(); //ON
  //ON 이후
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);
  System.out.println(((temp = ledTV.volumnDown())==-1)?"Power OFF":temp);

  ledTV.power(); //OFF
  //OFF 이후
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);

 }

}

 

 

-----------------------------------------------
요약

1. 객체 지향 개념

2. 객체, 클래스, 인스턴스

3. 멤버변수(속성), 메소드(기능), setter, getter

4. class, new, 참조변수


-----------------------------------------------

 

 

 

 

 

 

 

 


 

블로그 이미지

알 수 없는 사용자

,