1. 객체지향언어
- 객체지향 언어는 기존의 프로그래밍 언어와 다른 전혀 새로운 것이 아니라 기존의 프로그래밍 언어에 몇가지 새로운 규칙을 추가한 보다 발전된 형태의 언어이다. 즉, 몇가지 규칙들을 이용하여 코드간의 관계를 맺어줌으로써 보다 유기적으로 프로그래밍 할 수 있는 언어이다.
- 특징
- 코드의 재사용성이 높다.
- 기존의 코드를 이용하여 쉽게 작성할 수 있다.
- 코드의 관리가 용이하다
- 코드간 관계를 이용해 쉽게 코드를 변경할 수 있다.
- 신뢰성이 높은 프로그래밍이 가능하다.
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
※ 주의사항
- 객체지향의 개념을 이해했다 하더라도 실제 프로그램을 작성할 때 객체지향 적으로 구현하기는 쉽지 않다.
- 따라서 객체지향에 얽매이기보다는 프로그램을 기능적으로 완성하고 객체지향적으로 개선하며 점차 개선하는 것이 필요하다.
2. 클래스와 객체
객체 : 실제로 존재하는 것, 사물 또는 개념
ex) 책상, 의자, 자동차, TV와 같은 사물, 수학공식, 프로그램 에러, 논리 등의 개념
클래스 : 객체를 정의해 놓은 것으로 객체를 생성하기 위해 사용된다.
ex) 책상, 의자,자동차, TV등의 설계도, 수학공식, 프로그램 에러등을 정의해 놓은 것
아래는 클래스와 객체간의 관계를 예로 든 것이다.
클래스 | 객체 |
제품 설계도 | 제품 |
붕어빵 기계 | 붕어빵 |
거푸집 | 쇠 기구 |
이처럼 클래스는 여러개의 객체를 만들 수 있고, 클래스를 사용하여 객체를 만드는 것이다.
- 객체의 구성요소(속성과 기능)
객체는 속성과 기능으로 이루어져 있다.
- 속성 => 멤버변수, 특성, 필드, 상태
- 기능 => 메서드, 행위, 함수
자바에서는 이중 속성은 멤버변수, 기능은 메서드를 사용한다. 객체를 생성하면 클래스에 정의된 멤버와 메서드를 사용할 수 있다.
자동차로 속성과 기능의 예를 들어보면
속성 | 형태, 바퀴구동방식, 연료종류 |
기능 | 시동, 엑셀레이터, 브레이크, 방향표시등, 와이퍼, 워셔액 등 |
코드로는 아래와 같이 나타낼 수 있다.
public class Car {
boolean power; /** 시동 상태 */
int speed; /* 속력 */
void power(){ power = !power;}
void accelerator(){ speed++; }
void pushBreak(){ speed=0;}
}
전에 다뤘던 참조형변수라는 의미가 여기서 사용되는데요
기본형을 제외한 모든 클래스 변수들은(객체) 참조형으로 예제를 보면 어떤 느낌인지 알 수 있습니다.
public class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
System.out.println("c1의 speed = "+c1.speed+"입니다.");
System.out.println("c2의 speed = "+c2.speed+"입니다.");
for(int i =0; i<65; i++){c1.accelerator();} //65까지 악셀을 밟는다.
System.out.println("c1의 속력을 65까지 올렸습니다.");
System.out.println("c1의 speed = "+c1.speed+"입니다.");
System.out.println("c2의 speed = "+c2.speed+"입니다.");
c2 = c1;
System.out.println("c2 = c1 실행");
System.out.println("c1의 speed = "+c1.speed+"입니다.");
System.out.println("c2의 speed = "+c2.speed+"입니다.");
for(int i =0; i<10; i++){c1.accelerator();} //10 더 악셀을 밟는다.
System.out.println("c1의 속력을 10 더 올렸습니다.");
System.out.println("c1의 speed = "+c1.speed+"입니다.");
System.out.println("c2의 speed = "+c2.speed+"입니다.");
}
}
c2=c1; 아래 부분에 주목하시면 c1은 속도가 65, c2또한 c1으로 바꿔줬으니 똑같이 65겠죠?
여기서 c1만 속도를 10더 추가했는데 c1 과 c2가 모두75가 됐습니다.
그림으로 보시면
처음엔 각각의 객체를 가리키다가 c2=c1이 일어나는 순간 다음과 같은 일이 벌어집니다.
c2가 c1이 가지고 있는 주소가 되어 c1이 참조하는 것과 같은 것을 가리키게 되는 것이죠.
따라서 c1이 가리키는 0x100의 값을 변경하면 c2가 가리키는 0x100으 speed를 출력해도 c1과 같은 값이 나오는 것입니다.
public class IntegerTest {
public static void main(String[] args) {
int i1 = 10;
int i2 = 20;
System.out.println("i1 : "+ i1);
System.out.println("i2 : "+ i2);
i2 = i1;
System.out.println("i1 : "+ i1);
System.out.println("i2 : "+ i2);
i1 = 100;
System.out.println("i1 : "+ i1);
System.out.println("i2 : "+ i2);
}
}
기본형 변수와는 확실히 차이가 있죠?
'개발 > JAVA' 카테고리의 다른 글
[Java]객체지향 언어-4(상속/ 포함 등 클래스간의 관계) (0) | 2021.05.16 |
---|---|
[JAVA개념]객체지향언어-3 (0) | 2021.05.11 |
[JAVA개념]객체지향언어-2 (0) | 2021.05.10 |
[JAVA 개념] 변수, 배열 (0) | 2021.05.08 |
[JAVA 개념] 자바의 이해 (0) | 2021.05.05 |
댓글