OOP(Object-Oriented Programming)
객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙) |
참고.
객체지향 이론의 기본 개념은 '실제 세계는 사물(객체로)' 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다. 실제 사물의 속성과 기능을 분석 후 데이터(변수)로 정의함으로써 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현하고 이 가상세계에서 모의실험을 통해 많은 시간과 비용을 절약할 수 있다.
객체지향 핵심 개념(캡 상추다!)
캡슐화(Encapsulation)?
- 객체의 속성과 행위를 하나로 묶고 구현 내용을 외부에 감춘다.
- 정보은닉(Information Hiding)
상속(Inheritance)?
- 부모 클래스의 변수/메서드를 자식 클래스가 물려받아 그대로 사용 가능하게 해 줌.
- 부모 클래스는 superclass, 자식 클래스를 subclass라 부른다.
추상화(Abstraction)?
- 공통의 속성이나 기능을 묶어 이름을 붙이는 것, 객체 지향 관점에 클래스를 정의하는 것을 추상화라고 할 수 있다.
⭐다형성(Polymorphism)⭐?
- 하나의 객체가 여러 가지 타입을 가질 수 있는 것
객체지향 언어의 주요 특징
1. 코드의 재사용성이 높다? - 기존의 코드를 이용하여 쉽게 작성 가능. 2. 코드의 관리가 용이하다? - 유지보수가 용이하다. 적은 노력으로 쉽게 코드를 변경할 수 있다. 3. 신뢰성이 높은 프로그래밍을 가능하게 한다? - 중복 코드 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다. |
클래스 객체의 정의와 용도
클래스의 정의
- 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도
- 클래스는 객체를 생성하는 데 사용된다.
Q. 객체란?
- 실제로 존재하는 것. 사물 또는 개념
Q. 객체의 용도?
- 객체가 가지고 있는 기능과 속에 따라 다르다.
클래스 | 객체 |
제품 설계도 | 제품 |
참고.
우리가 타는 자동차(객체)를 만들기 위해서는, 자동차 설계도(클래스)가 필요하다.
프로그래밍에서는 먼저 클래스(설계도)를 작성한 다음, 클래스로부터 객체(자동차)를 생성하여 사용한다.
Q. 객체와 인스턴스란?
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 한다.
- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.
A. 객체와 인스턴스를 엄격히 구분할 필요는 없지만, 문맥에 따라 구별하여 사용하는 것이 좋다.
책상(객체)은 책상 클래스(설계도)의 인스턴스다. |
참고.
객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있고
인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.
객체의 구성요소 - 속성과 기능
속성(변수) | 크기, 길이, 높이, 색상, 볼륨, 채널 등 |
|
기능(메서드) | 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등 |
참고. 용어 정리
속성(property) | 멤버변수(variable), 특성(attribute), 필드(field), 상태(state) |
기능(function) | 메서드(method), 함수(function), 행위(behavior) |
클래스와 객체 Q&A
Q. 클래스가 왜 필요한가?
A. 객체(제품)를 생성하기 위해 필요합니다.
Q. 객체가 왜 필요한가.
A. 객체를 사용하기 위해.
Q. 객체를 사용한다는 것은?
A. 객체가 가진 속성과 기능을 사용하려고.
하나의 소스파일에 여러 클래스 작성 규칙.
package com.seulgae.ch06;
//하나의 소스파일에는 하나의 클래스만 작성하는 것이 바람직
//public class Hello2 {} // 소스파일의 이름은 public class 이름과 일치, public class가 없는 경우에는 상관없음
class hello2{}
class Hello3 {
public static void main(String[] args) { // 소스파일명과 클래스 이름이 다를 경우 컴파일러가 알아서 아무거나 실행시킴.
System.out.println("hello");
System.out.println("실습 타이틀 변경하기");
}
}
/*
public class Hello3 {} // 하나의 소스파일에는 하나의 public class만 허용
//The public type Hello3 must be defined in its own file
*/
class Hello4 {}
올바른 작성 예 | 설명 |
public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다. | |
public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다. |
잘못된 작성 예 | 설명 |
하나의 소스파일에 둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스에 public을 붙이지 않아야 한다. | |
소스파일의 이름이 public class의 이름과 일치하지 않는다. 소스파일의 이름을 'Hello2.java'로 변경해야 맞다. |
|
소스파일의 이름과 public class의 이름이 일치하지 않는다. 대소문자를 구분하므로 대소문자까지 일치해야 한다. 그래서, 소스파일의 이름에서 'h'를 'H'로 바꿔야 한다. |
객체의 생성
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; // Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv인스턴스 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
Tv t = new Tv(); // 한줄로 작성 가능
1. 참조 변수(주소를 담는 변수) 선언
Tv t;
2. 객체를 생성
new Tv();
3. 참조변수 t에 객체 주소를 담는다.
t = new Tv();
참고.
Tv t = new Tv(); // 한 줄로 작성 가능.
- 인스턴스는 참조 변수를 통해서만 다룰 수 있으며, 참조 변수의 타입은 인스턴스의 입과 일치해야 한다.
객체의 사용
package com.seulgae.ch06;
class Tv{
// Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // Tv를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // Tv의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel; } // Tv의 채널을 낮추는 기능을 하는 메서드
}
public class TvTest {
public static void main(String[] args) {
Tv t;
t = new Tv();
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은 " + t.channel + " 입니다.");
}
}
참조 변수가 가리키는 객체 메모리 구조.
t.channel = 7;
- t에 저장된 주소에 있는 인스턴스 멤버 변수 channel에 7을 저장한다.
- 인스턴스의 멤버 변수(속성)를 사용하려면 "참조 변수.멤버 변수"와 같이 하면 된다.
t.channelDown();
- t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.
- 인스턴스의 메서드를 사용하려면 "참조 변수.메서드"와 같이 하면 된다.
package com.seulgae.ch06;
class Tv2{
// Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // Tv를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // Tv의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel; } // Tv의 채널을 낮추는 기능을 하는 메서드
}
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의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
Tv t1 = new Tv();
Tv t2 = new Tv();
t1.chennel = 7;
- Tv클래스의 인스턴스 t1과 t2를 생성한 후에, 인스턴스 t1의 멤버 변수인 channel의 값을 변경한다면 결과는?
- 같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버 변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.
Q. 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지한다는 말이 뭔가요?
A. 집 주소가 다르다고 생각하면 됩니다. 그래서 집에 같은 Tv(chennel)가 있다고 해도 채널 변경 시 다른 주소에 있는 집 Tv의 채널이 변경되지 않는 것처럼 생각하시면 됩니다.
참조변수의 규칙
하나의 인스턴스를 여러 개의 참조변수가 가리킬 수 있지만.
여러 인스턴스를 하나의 참조변수가 가르킬 수 없다.
Q. 왜?
A. 변수는 하나의 값만 저장 가능하기 때문이다.
객체 배열
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv타입의 참조변수 배열
이건 객체 배열만 생성한거임. 사용하려면 객체를 생성해야됨.
객체 배열만 생성해 놓고 '분명히 객체를 생성했는데, 에러가 발생한다.'라는 똥멍청이짓 하지말자.
// 객체를 생성해서 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
배열의 초기화 블럭을 사용한다면 한줄로 간단히 할 수 있다.
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
'Study > Java' 카테고리의 다른 글
객체지향 프로그래밍 6장(11강 ~ 15강) (0) | 2022.06.03 |
---|---|
객체지향 프로그래밍 6장(6강 ~ 10강) (0) | 2022.06.02 |
Java18_멀티스레드 (0) | 2022.05.14 |
Java16_컬렉션프레임워크 (0) | 2022.05.14 |
Java15_내장클래스 (0) | 2022.05.14 |