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;
}
}
// 이외에도 시간의 차를 구하는 함수를 추가하는 등 클래스 기능을 향상 시킬 수 있음