(캡 상 추 다)
1. 캡슐화
2. 상속
3. 추상화
4. 다형성
Q. 객체지향 개념은 어떻게 공부해야 하나요?
@객체지향개념 규칙을 외워야함!
@A4용지 2장 정도로 정리해서 하루 1번씩 보기!
@그 이후 JSP, Spring으로 실습을 통해 빨리 응용 해봐야한다.(이해보단 실습위주로!!)
@추가로 디자인패턴, 객체지향 개념 관련 책은 실습 이후에 봐라.
클래스의 정의
클래스의 용도
객체의 정의
객체의 용도
객체 = 속성(변수) + 기능(메서드)
예) Tv
속성(변수): 크기, 길이, 높이, 색상, 볼륨, 채널 등
기능(메서드): 켜기, 끄기, 볼륨 업, 볼륨 다운, 채널 변경 등
class Tv { //Tv 설계
String color; //색깔
boolean power; //전원상태
int channel; //채널
void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }
}
객체 : 모든 인스턴스를 대표하는 일반적 용어
인스턴스 : 특정 클래스로부터 생성된 객체(예:Tv인스턴스)
클래스(설계도) ---> 인스턴스(객체)(제품)
//인스턴스화(제품생성)
Q. 클래스(설계도)가 왜 필요한가?
A. 객체(제품)를 생성하기 위해
Q. 객체(예 Tv)가 왜 필요한가?
A. 객체를 사용하기 위해
Q. 객체를 사용한다는 것은?
A. 객체가 가진 속성(변수)과 기능(메서드)을 사용하려고
(보통은 하나의 소스파일에 하나의 클래스)
Hello2.java
public class Hello2 {}
class Hello3 {}
//public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.
Hello2.java
class Hello2 {}
class Hello3 {}
//public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.
Hello2.java
public class Hello2 {}
public class Hello3 {}
//하나의 소스파일에 둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스에 public을 붙이지 않아야 한다.
Hello3.java
public class Hello2 {}
class Hello3 {}
//소스파일의 이름이 public class의 이름과 일치하지 않는다. 소스파일의 이름을 'Hello2.java'로 변경해야 맞다.
hello2.java
public class Hello2 {}
class Hello3 {}
//소스파일의 이름과 public class의 이름이 일치하지 않는다.
대소문자를 구분하므로 대소문자까지 일치해야한다.
그래서 소스파일의 이름을 'H'로 바꿔야 한다.
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; //Tv클래스 타입의 참조변수(리모콘) t를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
Tv t= new Tv();
//참조변수(리모콘)을 객체와 연결
t.channel = 7; //Tv인스턴스의 멤버변수 channel에 7을 저장한다.
t.channelDown(); //Tv인스턴스 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 "+t.channel+" 입니다.");
Tv t; //Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스 주소를 t에 저장
Tv t; //객체 생성 - Tv인스턴스를 참조하기 위해 변수 t선언
t = new Tv(); //객체 생성 - Tv인스턴스 생성
t.channel = 7; //객체 사용 - 변수 사용
t.channelDown(); //객체 사용 - 메서드 사용
객체의 생성과 사용 - 예제
Tv t1 = new Tv();
Tv t2 = new Tv();
t1.channel = 7;
//객체마다 별도의 저장공간이 생김
Tv t1 = new Tv();
Tv t2 = new Tv();
t2 = t1; //t2의 객체 사용불가, 2개의 리모컨이 하나의 객체를 가리킴
t1.channel = 7;
객체 배열 == 참조변수 배열
Tv tv1, tv2, tv3;
--> 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() }; //한 문장으로
Tv t1 = new Tv();
Tv t2 = new Tv();
Tv t3 = new Tv();
//참조변수 배열 == 객체의 배열
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
class Time {
int hour;
int minute;
int second;
}
int hour;
int minute;
int second;
//시,분,초를 따로 묶음 <--> 시,분,초를 하나로 묶음
Time t = new Time();
int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3;
//<--> 시,분,초를 하나로 묶음
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();
int[] hour = new int[3];
int[] minute = new int[3];
int[] second = new int[3];
//<--> 시,분,초를 하나로 묶음(객체 배열)
Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
//12시 34분 56초를 저장
//1. 비 객체지향
int hour = 12;
int minute = 34;
int second = 56;
//2. 객체지향
Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;
class Variables //클래스 영역 시작 - 선언문만 가능(변수선언, 메서드선언 두 개만 가능)
{
int iv; //인스턴스 변수
static int cv; //클래스 변수(static변수, 공유변수)
void method() //메서드 영역 시작
{
int lv = 0; //지역변수
}//메서드 끝
}//클래스 끝
객체 = iv를 묶어놓은 것
[정리]
영역
개별(iv) : 숫자, 무늬, 객체마다 다르게 유지되어야 함.
공통(cv) : 높이, 폭
속성
개별적인 것 : 무늬, 숫자 --> iv
공통적인 것 : 폭, 높이 --> cv
class Card {
String kind; //무늬
int number; //숫자
static int width = 100; //폭
static int height = 250; //높이
}
Card c = new Card(); //객체 생성
c.kind = "HEART"; //iv, 객체 사용 시작
c.number = 5; //iv, 객체 사용
Card.width = 200; //cv, 객체 사용
Card.height = 300; //cv, 객체 사용 끝
--flash 동영상 - member.exe 참고--
int add(int x, int y) { //int - 반환타입, add - 메서드이름, int x, int y - 매개변수(입력)
int result = x + y;
return result; //결과를 반환
}
int add(int a, int b) //선언부
//int-반환타입, add-메서드이름, int a,b-매개변수
{
int result = a+b; //구현부
return result; //구현부
} //lv(지역변수)-a,b,result
//반환할게 없으면 반환타입을 void라고 씀
메서드 내에(메서드영역에) 선언된 변수, 매개변수(입력)와 메서드영역 변수.
다른 메서드와 이름이 같아도 문제 없다.
메서드를 불러서 작업을 시키는 것
메서드이름(값1, 값2, ...); //메서드를 호출하는 방법
print99danAll(); //void print99danAll()을 호출 - 입력X, 반환타입 void(출력이 없다)
int result = add(3,5); //int add(int x, int y)를 호출하고, 결과를 result에 저장
메서드 수행에 필요한 메모리가 제공되는 공간.
메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제.
밑이 막힌 상자. 위에 차곡차곡 쌓인다.
---플래시 동영상(PrimitiveParam.exe, ReferenceParam.exe)참고---