JAVA

[JAVA] 객체지향언어

큐범 2021. 8. 10. 13:10

객체지향언어의 역사

객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 점차 구체적으로 발전되었으며 1060년대 중반에 객체지향이론을 프로그래밍언어에 적용한 시뮬라(Simula)라는 최초의 객체지향언어가 발생했다. 그 이후 1980년대 중반에 C++을 비록하여 여러 객체지향 언어가 발표되면서 1995년에 자바가 발표되고 1990년대 말에 인터넷의 발전과 함께 크게 유행하면서 객체지향언어는 프로그래밍의 주류로 자리 잡았다.

객체지향언어

  1. 코드의 재사용성이 높다.새로운 코드를 삭성할때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
  1. 코드의 관리가 용이하다.코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
  1. 신뢰성이 높은 프로그래밍을 가능하게 한다.제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록하며,
  2. 코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.

클래스와 객체

클래스의 정의 : 객체를 정의해 놓은 것이다.

클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념

객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

유형의 객체 : 책상, 의자, tv 컴퓨터

무형의 객체 : 수학공식, 프로그램의 에러와 같은 논리나 개념

 

 

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

객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

클래스 → 인스턴스(객체)

객체의 구성요소 - 속성과 기능

속성(property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

기능(function) : 메서드(method), 함수(function), 행위(behavior)

인스턴스의 생성과 사용

package object_oriented_programming;

class Tv {
	//Tv의 속성(멤버변수)
	String color;
	boolean power;
	int channel;
	
	//Tv의 기능(메서드)
	void power() {power = !power;}
	void channelUp() {++channel;}
	void ChannelDown() {--channel;}
	
}

class TvTest{
	public static void main(String[] args) {
		Tv t;
		t = new Tv();
		t.channel =7;
		t.ChannelDown();
		System.out.println("현재 채널은 "+t.channel+"입니다.");
	}
}
//결과
현재 채널은 6입니다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
package object_oriented_programming;

public class TvTest2 {

	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+"입니다.");
		
		t1.channel = 7;
		System.out.println("t1의 채널을 7로 변경");
		
		System.out.println("t1의 channel값은 "+t1.channel+"입니다.");
		System.out.println("t2의 channel값은 "+t2.channel+"입니다.");
	}

}
//결과
t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 채널을 7로 변경
t1의 channel값은 7입니다.
t2의 channel값은 0입니다.
package object_oriented_programming;

public 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.channel = 7;
		System.out.println("t1의 채널을 7로 변경");
		
		System.out.println("t1의 channel값은 "+t1.channel+"입니다.");
		System.out.println("t2의 channel값은 "+t2.channel+"입니다.");
	}

}
//결과
t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 채널을 7로 변경
t1의 channel값은 7입니다.
t2의 channel값은 7입니다.

객체 배열

package object_oriented_programming;

public class TvTest4 {

	public static void main(String[] args) {
		Tv[] tvArr = new Tv[3];
		
		for(int i=0; i<tvArr.length; i++) {
			tvArr[i] = new Tv();
			tvArr[i].channel = i+10;
		}
		for(int i=0; i<tvArr.length; i++) {
			tvArr[i].channelUp();
			System.out.printf("tvArr[%d].channel=%d%n", i,tvArr[i].channel);
		}
	}
}

//결과
tvArr[0].channel=11
tvArr[1].channel=12
tvArr[2].channel=13

클래스의 또 다른 정의

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간
  1. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
  1. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
  1. 클래스 : 데이터와 함수의 결합(구조체+함수)
package object_oriented_programming;

public class Time {
	private int hour;
	private int minute;
	private float second;
	
	public int getHour() {return hour;}
	public int getMinute() {return minute;}
	public float 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(float s) {
		if(s < 0.0f || s > 59.99f) return;
		second = s;
	}
	
}

제어자를 통해 변수의 값을 직접 벼경하지 못하도록하고 대신 메서드를 통해서 값을 변경하는 get, set 메서드를 작성한다.

출처 : JAVA의 정석 - (남궁성지음)