JAVA/객체지향 프로그래밍 I

객체지향 프로그래밍 I(object-oriented programming I)_1

whale_it 2018. 8. 17. 10:50

객체지향 프로그래밍 I(object-oriented programming I)

 

1.객체지향언어

1.1 객체지향언어의 역사

  • 초창기 컴퓨터는 주로 과학실험이나 미사일 발사시럼 같은 모의실험(simulation) 목적으로 사용
  • 모의실험은 실제 세계와 유사한 가상 세계를 컴퓨터 속에 구현하고자 노력 -> 객체지향이론 탄생
  • 기본개념 - 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호 작용
  • 실제 사물의 속성과 기능을 데이터(변수)와 함수로 정의
  • 객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 구체적으로 발전
  • 1960년 중반 객체지향이론을 적용한 시뮬라(Simula)라는 최초 언어 탄생
  • 1980년대 중반 C++ 등이 발표 되면서 본격적으로 사용(프로그램의 규모가 커짐)
  • 자바가 1995년 발표되고 1990년대 말 인터넷의 발전과 함께 주류로 자리 잡음

 

1.2 객체지향 언어

  • 코드의 재사용이 높다

    • 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성
  • 코드의 관리가 용이

    • 코드의 관계를 이용하여 적은 노력으로 쉽게 코드 변경
  • 신뢰성이 높은 프로그래밍 가능

    • 제어자와 메서드를 이용하여 데이터 보호, 코드의 중복 제거로 코드 불일치 최소화

 

2.클래스와 객체

2.1 클래스와 객체의 정의와 용도

  • 정의 : 클래스는 객체를 정의해 놓은 것
  • 용도 : 클래스 객체를 생성하는 데 사용

 

사전적 정의

  • 정의 : 실제로 존재하는 것, 사물 또는 개념
  • 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
  • 유형의 객체 : 책상, 의자, 자동차, TV 와 같은 사물
  • 무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념\

클래스 : 객체 제품 설계도 : 제품 TV 설계도 : TV 붕어빵 기계 : 붕어빵

 

  • JDK(Java Development Kit)은 유용한 클래스(Java API)를 기본 제공

 

2.2 객체와 인스턴스

  • 클래스로부터 객체를 만드는 과정 : 클래스의 인스턴스화(instantiate)
  • 클래스로부터 만들어진 객체 : 클래스의 인스턴스(instance)
  • 객체 : 모든 인스턴스를 대표하는 포괄적인 의미
  • 인스턴스 : 어떤 클래스로부터 만들어진 보다 구체적인 의미

 

2.3 객체의 구성요서 - 속성과 기능

  • 속성 (property) : 맴버변수(member variable), 특성(attribute), 필드(field), 상태(state)
  • 기능(function) : 메서드(method), 함수(function), 기능(behavior)
 TV
속성크기, 길이, 높이, 색상, 볼륨, 채널 등
기능켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기

 

2.4 인스턴서의 생성과 사용

package ch06;
class Tv { 
     // Tv의 속성(멤버변수) 
     String color;           	// 색상 
     boolean power;         	// 전원상태(on/off) 
     int channel;           	// 채널 

     // Tv의 기능(메서드) 
     void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드  
     void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
     void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드  
}

class TvTest { 
      public static void main(String args[]) { 
            Tv t;                  // Tv인스턴스를 참조하기 위한 변수 t를 선언       
            t = new Tv();          // Tv인스턴스를 생성한다. 
            t.channel = 7;         // Tv인스턴스의 멤버변수 channel의 값을 7로 한다. 
            t.channelDown();       // Tv인스턴스의 메서드 channelDown()을 호출한다. 
            System.out.println("현재 채널은 " + t.channel + " 입니다."); 
      } 
} 

  • 인스턴스는 참조변수를 통해서만 사용 가능

package ch06;
class TvTest2 {
	public static void main(String args[]) {
		Tv t1 = new Tv();  // Tv2 t1; t1 = new Tv2();를 한 문장으로 가능
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

		t1.channel = 7;	// channel 값을 7으로 한다.
		System.out.println("t1의 channel값을 7로 변경하였습니다.");

		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
	}
}
/*
class Tv { 
     // Tv의 속성(멤버변수) 
     String color;           // 색상 
     boolean power;          // 전원상태(on/off) 
     int channel;          	 // 채널 

     // Tv의 기능(메서드) 
     void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드 
     void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
     void channelDown() {  --channel; }  // TV의 채널을 낮추는 기능을 하는 메서드  
}
 */
  • 같은 클래스로부터 생성되어도 멤버변수는 서로 다른 각각의 값 유지

package ch06;
class TvTest3 {
	public static void main(String args[]) {
		Tv t1 = new Tv();
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

		t2 = t1;		// t1이 저장하고 있는 값(주소)을 t2에 저장한다.
		t1.channel = 7;	// channel 값을 7로 한다.
		System.out.println("t1의 channel값을 7로 변경하였습니다.");

		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
	}
}

/*
class Tv { 
     // Tv의 속성(멤버변수) 
     String color;           // 색상 
     boolean power;          // 전원상태(on/off) 
     int channel;          	 // 채널 

     // Tv의 기능(메서드) 
     void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드 
     void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
     void channelDown() {  --channel; }  // TV의 채널을 낮추는 기능을 하는 메서드  
}
 */
  • t1과 t2가 같은 주소를 참조

2.5 객체 배열

  • 많은 객체를 다룰 경우 배열이 사용
  • 객체 배열 안에는 데이터가 아니라 주소가 들어감

객체배열의 선언 및 초기화

Tv[] tvArr = new Tv[3] Tv[] tvArr = { new Tv(), new Tv(), new Tv()}

  • 모든 배열이 그렇듯 객체 배열도 같은 타입의 객체만 저정
  • 하나의 배열로 여로 종류의 배열 처리 : 다형성(polymorphism)
package ch06;
class TvTest4 {
	public static void main(String args[]) {
		Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv객체 배열

		// Tv객체를 생성해서 Tv객체 배열의 각 요소에 저장
		for(int i=0; i < tvArr.length;i++) {
			tvArr[i] = new Tv();
			tvArr[i].channel = i+10; // tvArr[i]의 channel에 i+10을 저장
		}

		for(int i=0; i < tvArr.length;i++) {
			tvArr[i].channelUp();  // tvArr[i]의 메서드를 호출. 채널이 1증가
			System.out.printf("tvArr[%d].channel=%d%n",i,tvArr[i].channel);
		}
	} // main의 끝
}


/*
class Tv { 
     // Tv의 속성(멤버변수) 
     String color;           // 색상 
     boolean power;          // 전원상태(on/off) 
     int channel;          	 // 채널 

     // Tv의 기능(메서드) 
     void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드 
     void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
     void channelDown() {  --channel; }  // TV의 채널을 낮추는 기능을 하는 메서드  
}
*/

 

2.6 클래스의 또 다른 정의

  • 클래스 - 데이터와 함수의 결합
  • 변수 -> 배열(같은 종류 변수) -> 구조체(다른종류 변수) -> 클래스(구조체 + 함수)
  • 사용자 정의 타입(user defined type)
// 시간이 필요
int hour; // 시
int minute; // 분
float second; // 초

// 3개의 시간이 필요
int hour1, hour2, hour3;
int minute1, minute2, minute3;
float second1, second2, second3;

// 10개가 필요
int[] hour = new int[10]; // 시
int minute = new int[10]; // 분
float second = new float[10]; // 초

// 이럴꺼면 클래스로 정의 시간이 필요하면 찍어냅시다
class Time{
    int hour; // 시
    int minute; // 분
    float second; // 초
}

// 게다가 제약 조건(유요한 값사용)을 추가 할 수도 있음
// . 시분초는 모두 0보다 크거나 같아야함
// . 시의 범위는 0~23, 분과 초의 범위는 0~59 이다

class Time{
    private int hour; // 시
    private int minute; // 분
    private float second; // 초
    
    public int getHour() { return hour;}
    public int getMinute() { return minute;}
    public int getSecond() { return second;}
    
    public void setHour(int h){
        if(h<0 || h>23) return;
        hour = h;
    }
    
    public void setMinute(int m){
        if(m<0 || m>59) return;
        minute = m;
    }
    
    public void setSecond(int s){
        if(s<0 || s>59) return;
        second = s;
    }
}

// 이외에도 시간의 차를 구하는 함수를 추가하는 등 클래스 기능을 향상 시킬 수 있음