본문 바로가기
프로그래밍/JAVA

클래스와 객체

by 가므자 2012. 2. 24.

클래스와 객체
클래스의 정의 - 객체를 정의해 놓은 것
클래스의 용도 - 객체를 생성하는데 사용.

객체의 정의 - 실제로 존재하는것. 사물 또는 개념
객체의 용도 - 객체가 가지고 잇는 기능과 속성에 따라 다름

유형의 객체 - 책상, 의자, 자동차, TV와 같은 사물
무형의 객체 - 수학 공식, 프로그램 에러와 같은 논리나 개념

TV설계도(클래스) - TV라는 제품(객체)
클래스는 단지 객체를 사용하는데 사용될 뿐, 객체 그 자체는 아니다.

우리가 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는데 과정이 선행되어야 한다.
JDK에서는 프로그래밍을 위해 많은 수의 유용한 클래서(JAVA API)를 기본적으로 제공하고 있다.



객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴화라고 한다.
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

객체는 다수의 속성과 다수의 기능을 갖고 있다.
개체가 가지고 있는 속성과 기능을 그 객체의 멤버라고 한다.
속성과 기능을 각각 변수와 함수로 표현한다.

객체의 구성요소 - 속성과 기능
속성 - 멤버 변수, 특성, 필드, 상태
기능 - 메서드, 행위, 함수

예를 들어, Tv의 속성으로는 전원상태, 크기, 길이, 높이, 색상 같은 것들이 있다.

속성 → 멤버변수(variable)
[수식어][필드타입][필드이름];

기능 → 메서드 (metod)
[수식어][리턴타입]메서드이름([파라미터목록]){
자바코드1;
...
자바코드2;
return 값;
}

Private int birthYear; 

public int getBirthYear(){  // 리턴 타입 int, birthYear 필드 값을 리턴한다.
         return birthYear;
}
public void setBirthYear(int birthYear){   // 리턴 타입 void, 첫번째 birthYear 파라미터 값을 birthYear필드에 할당한다.
         this.birthYear = birthYear; // 첫번째 파라미터 이름과 필드의 이름이 birthYear로 같은데 이렇게 메서드의 파라미터 이름과 필드의 이름이 같은 겨웅 메서드 내부에서 필드에 접근하려면 this 키워드를 사용해 주어야한다.
}


채널 → int channel
채널 높이기 → channelUp(){...}

*TV클래스 만들기
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의 채널을 낮추는 기능의 메서드 */
}

power()의 'power =!power;' 이 문장에서 power의 값이 true면 false로 , false면 true로 변경하는 일을 한다.
각 변수의 자료형은 속성의 값에 알맞은 것을 선택해야한다.
 
*인스턴스의 생성과 사용(TV클래스로부터 인스턴스를 생성하고 인스턴스의 속성(channel)과 함수(channelDown())를 사용하는 방법을 보여준다.)
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 + "입니다.");

}
}

[ 실행결과 ]
현재 채널은 6 입니다.
Tv t; --> tv클래스의 참조변수 t를 선언하여 메모리에 참초변수 t를 위한 공간을 마련해 놓습니다.
Tv → 클래스 타입, t → 참조변수

t = new Tv(); --> 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성됩니다.(초기화)
참조변수 t를 통해 Tv인스턴스에 접근할 수 있습니다.
tv() 인스턴스 생성
t.channel = 7; --> 참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장합니다.
t.channelDown(); --> 참조변수 t가 참조하고 있는 Tv 인스턴서의 ChannelDown메소드를 호출합니다.

간단하게 정리하자면, TV와 TV리모콘의 관계와 같다. 다른 점이 있다면, 오직 참조 변수를 통해서만 다룰 수 있다.





public : 모든 접근을 허용
protected : 상속관계

default : 아무것도 안쓰는것을 default 라함
private : 현재클래스 내에서만 허용

class 클래스 이름 { //클래스 헤드 (선언부)
접근_지정자 자료형 변수_이름; //속성 선언
접근_지정자 생성자( ) { //생성자 정의
. . . . .
}
접근_지정자 자료형 메서드_이름( ) { //메서드정의
. . . . .
}
}

class Animal{ String name; int age; } => Animal 클래스에 String속성의 name과 int속성의 age 변수선언

*인스턴스의 생성과 사용2
class Tv{
String color="red";
int channel = 1;
boolean power = false;
}
class TvMain{
public static void main(String[] args){
Tv t1 = new Tv();
Tv t2 = new Tv();
t1.channel = 100;
t2.channel = 200;
System.out.println(t1.channel);System.out.println(t2.channel);
}
}    
 
class Tv{
String color="red";
int channel = 1;
boolean power = false;
}

class TvMain{
public static void main(String[] args){
Tv t1 = new Tv();
Tv t2 = new Tv();
t1 =t2; //주소를 대입하는 것  
t1.channel = 100;
t2.channel = 200;
System.out.println(t1.channel);
System.out.println(t2.channel);  
}
}

: 하나의 인스턴스를 여러 개의 참조변수가 가리키는 것 (가능)
: 여러 개의 인스턴스를 하나의 참조변수가 가리키는 것 (불가능)



클래스의 또 다른 정의 
① 클래스 : 데이터와 함수의 결합

변수 : 하나의 데이터를 저장할 수 있는 공간 
배열 : 같은 타입의 여러 데이터를 저장할 수 있는 공간 
구조체 : 타입에 관계없이 서로 관련된 데이터들을 저장할 수 있는 공간 
클래스 : 데이터와 함수의 결합(구조체 + 함수)

2) 사용자 정의 타입(User-defined type) class 
프로그래머가 직접 새로운 타입을 정의할 수 있다. 
서로 관련된 값을 묶어서 하나의 타입으로 정의한다.

'프로그래밍 > JAVA' 카테고리의 다른 글

객체와 클래스  (0) 2012.02.28

댓글