2024.05.23.THU <D+3> ,객체지향
A. 객체지향의 장점
D. Object & instance (객체와 인스턴스)
=> 인스턴스화: 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 함 (메모리에 로딩(적재)하는 행위)
=> 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 함.
=> 인스턴스화는 객체라고 함. ("instance = Object"가 성립)
E. 객체의 구성요소
1. 속성 (Property) : 멤버변수, 필드, 상태, 특성
2. 기능 (fuction) : 메소드, 함수, 행위
F. 객체 배열 - 객체배열에 저장되는 값은 instance의 주소값.
G. 변수와 메소드
1. 변수의 종류
기본형 매개변수 : 변수의 값을 읽기만 할 수 있음(원본 수정이 불가능. read only)
참조형 매개변수 : 변수의 값을 읽고 수정할 수 있음 (원본 수정이 가능. read & write)
method (메소드)
=> 특정 삭업을 수행하는 일련의 문장들의 묶음
-메소드 사용이유: 높은 재사용성, 중복된 코드의 감소, 프로그램의 구조화, 리팩토링시, 메소드를 자주 활용하게 됨.
참조형 반환타입: 참조변수의 값(instance의 주소)이 반환(return)
H. 클래스 메소드와 인스턴스 메소드
1. 클래스 메소드 - static 키워드를 사용. (인스턴스와 관계 없는 작업을 수행)
2. 인스턴스 메소드 - static 키워드를 사용하지 않음. (인스턴스 변수와 관련된 작업을 수행. 인스턴스로 생성되어야만 호출이 가능)
=> 클래스 설계 시, 멤버 변수 중 모든 인스턴스에 공통으로 사용 하는 것에 static를 붙인다.
=> 클래스 변수 (static 변수)는 인스턴스를 생성하지 않아도 사용이 가능하다.
=> 클래스 메소드 (static 메소드)는 인스턴스 변수를 사용할 수 없다.
=> 메소드 내에서 인스턴스 변수를 사용하지 않다면, static을 붙이는 것을 고려한다.
클래스 변수 & 인스턴스 변수 에제코드)
class Tv{
// 속성, 멤버변수
String color;
boolean power;
private int channel; //private는 접근제어지시자.
// channel setter (세터 - 멤버변수의 값을 변경, 생성)
// public은 접근제어지시자
// void는 반환하는 값이 없음.
public void setChannel (int ch) {
//1. 유효한 channel(값)인지 체크.
if (ch < 0)
{ return ; } //채널이 음수이면 적용하지 않음.
channel = ch; //양수이면 멤버변수에 적용.
}
// channel에 대한 getter(게터) 멤버변수의 값을 조회
public int getChannel() {
return channel;
}
// 기능, 메소드 구현하기
// power = boolean, 논리형 = 참 & 거짓으로 판단 ( !=> 부정 연산자)
void power() {power = !power;}
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
public class Television {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tv t ; // Tv변수만 선언된 상태, 인스턴스(메모리 적재) 상태는 아님.
// t는 참조변수이고, 참조변수가 초기화가 안된 상태
// 기본 초기화인 상태 => null 로 초기화가 되어 있는 것.
t = new Tv(); //t라는 참조 변수가 null에서 실제 Tv 객체의 주소로 초기화됨. 객체로 로딩
//즉, 사용할 수 있는 상태. 멤버변수 접근이 가능하고, 메소드 호출도 가능.
//ex) 멤버변수 초기화 전의 상태.
/**
*color => null
*power => false
*channel => 0**/
//멤버변수 초기화
/**
* t.channel = 10;
* t.channel =- 100; // 논리적으로 채널이 마이너스인 경우는 없음
* // 문제점: 멤버변수를 함부로 접근하면 안됨.
* // 해결방안: 직접접근이 아닌 간접접근이 되도록 하는 기능
* // 체크해서 문제가 없다면 멤버변수에 적용
* // 정리 1=> 멤버변수에 접근제어자가 필요
* 2=> 메소드가 필요 (setter,세터) **/
t.setChannel(-100);
System.out.println(t.getChannel());
t.channelUp();
System.out.println(t.getChannel());
t.channelDown();
System.out.println(t.getChannel());
t.channelUp();
System.out.println(t.getChannel());
// Tv 객체배열
Tv t3, t4, t5; // 변수 3개로 관리하게 됨. Tv가 1000개 일 경우,변수도 1000개 필요.,
Tv[] tvArr = new Tv[3]; // 하나의 배열로 3개의 Tv를 관리, Tv가 1000대라도 변수는 1개
// 위의 new Tv는 자세히보면 ()가 없음.
// 객체 3개로 만들어질 것이라고 생각하면 안됨!
//=> 단지, 주소값 3개를 저장할 수 있는 배열이 만들어진 상태 일 뿐임.
// 따라서, 3개의 요소는 모두 null상태.
// 각 요소에 객체를 생성해서 그 객체의 주소값을 배열의 요소에 저장해야 함.
// (위의 과정을 마친 후) 객체배열을 생각한대로 사용이 가능해짐.
// + 객체 배열의 요소 초기화하기
// tvArr[] = {new Tv(), new Tv(), new Tv()};
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
}
}
I. 오버로딩.
J. 생성자
=> 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'임.
=> 인스턴스의 초기화 작업에 주로 사용됨.
=> 인스턴스 생성 시, 실행되어야 할 작업을 위해서도 사용됨.
1. 생성자의 특징 : 구조가 메소드와 유사, 차이점은 반환값이 없음 (void 사용 X)
java MyMath mm = new MyMath(); // 현재의 생성자는 코드에 없음, 컴파일러가 기본적으로 제공해줌 !!