<1> 클래스의 정의와 인스턴스 생성 : 완벽한 개체지향 언어 java
1. 객체지향 프로그래밍의 이해
1) 객체 (object) : 물건, 또는 대상
2) 객체지향 프로그래밍
example)
"나는 과일장수에게 두 개의 사과를 구매했다 ! " 에서
객체 : 나, 과일장수, 사과
액션 : 객체 '사과'의 구매, 객체 '사과'의 판매
-> 객체지향 프로그래밍에서는 객체(나, 과일장수)를 등장시킬 수 있을 뿐만 아니라 행위('나'라는 객체가 '과일장수'로부터 '사과'구매, '과일장수'가 '나'에게 '사과'판매) 도 그대로 표현할 수 있다.
- 객체지향 프로그래밍 : 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍
* 뒤의 내용부터 코드의 간결성을 위해 '사과'는 객체화 시키지 않는다.
2. 객체는 데이터와 기능으로 이루어진다.
1) 객체 과일장수 : "과일의 판매"
- 과일을 판다 행동(behavior)
- 과일장수는 사과 20개, 오렌지 10개 보유 상태(state)
- 과일장수의 과일판매 수익은 50,000원 상태(state)
:
(1) 객체는 하나 이상의 상태 정보(데이터)와 하나 이상의 행동(기능)으로 구성
(2) 상태 정보는 변수를 통해서 표현(변수에 상태 정보를 저장할 수 있으므로), 행동은 메소드를 통해서 표현
2) 과일장수의 상태 정보 표현(변수) *사과만 판다고 가정
-보유하고 있는 사과의 수 -> int numOfApple;
-판매 수익 -> int myMoney;
3) 과일장수의 행위(과일판매) 표현 (메소드) *이 메소드 내에서 과일장수의 현재상태를 나타내는 위의 변수에 직접 접근 가능하다고 가정
int saleApple(int money) //사과 구매액이 메소드의 인자로 전달
{
int num=money/1000; //사과가 개당 1000원이라고 가정
numOfApple-=num; //사과의 수가 줄어들고
myMoney+=money; //판매 수익 발생
return num; //실제 발생한 사과의 수 반환
}
============↓ 이들을 묶어서 객체라는 것을 통해 실체화* ===================*
3. 클래스(class)라는 틀을 기반으로 객체 생성
: '나' 또는 '과일장수'로 객체를 생성하기 위해선 둘을 위한 틀을 만들어야 한다.
1) 틀 구성 방식
class FruitSeller
{
int numOfApple=20;
int myMoney=0; //변수선언
public int SaleApple(int money)
{
int num = money/1000;
numOfApple-=num;
myMoney+=money;
return num;
} //메소드 정의
}
2) 클래스
-class FruitSeller : FruitSeller라는 이름의 틀 정의 , 틀 = 클래스(class)
3) 클래스의 구성 요소
-위 예제에서 2개의 변수, 하나의 메소드 : 클래스는 객체를 구성하는데 필요한 변수와 메소드로 구성
-메소드 내에서 동일한 클래스 안에 선언된 변수에 접근 가능
*static 키워드 삽입 x (-> chpter10에서 배움)
---- "나는 과일자수에게 2000원을 주고 두 개의 사과를 구매했다" 시뮬레이션 하기 위해 필요한 클래스 정의-----**
;
4. '과일장수' 클래스 정의와 키워드 final
- 과일장수 클래스에 추가 : "2,000원 벌었어, 남은 사과는 18개 이고 말이야!" 라고 말하는 행위
1) '과일장수' 클래스 정의 FruitSeller
class FruitSeller
{
final int APPLE_PRICE=1000; //사과 가격
int numOfApple=20;
int myMoney=0;
public int saleApple(int money)
{
int num=money/APPLE_PRICE;
numOfApple-=num;
myMoney+=money;
return num; //판매한 과일의 수 반환
}
public void showSaleResult()
{
System.out.println("남은 사과 : "+numOfApple);
System.out.println("판매 수익 : "+myMoney);
}
}
-showSaleResult 메소드 추가
-final int APPLE_PRICE=1000; 으로 사과 가격 추가
2) 키워드 final
- final 변수 : final 키워드 삽입 후 선언한 변수 (변수가 상수화 된것이기 때문에 final 상수라고도 한다)
- final 선언 : " 한번 값이 결정된 이 변수의 값은 변경이 불가능하다!" - 지역변수로 final이 선언되면 딱 한번 값의 초기화가 가능
- 선언과 동시에 초기화 아닌 선언만 하는 것 가능.
final int APPLE_PRICE;
-> 딱 한번 초기화 가능
APPLE_PRICE=1000;
5. '나(me)' 클래스 정의
1) 삽입할 변수 ('나'의 상태) : 돈, 물품
-소유하고 있는 현금 -> int myMoney;
-소유하고 있는 사과의 수 -> int numOfApple;
2) 삽입할 메소드 ('나'의 행위) : 과일의 구매 -> buyApple의 메소드 정의
3) '나'의 클라스 정의 FruitBuyer
class FruitBuyer
{
int myMoney=5000;
int numOfApple=0;
public void buyApple(FruitSeller seller, int money)
{
numOfApple+=seller.saleApple(money);
myMoney-=money;
}
public void Result()
{
System.out.println("현재 잔액 : "+myMoney);
System.out.println("사과 개수 : "+numOfApple);
}
}
** 보라색으로 표시한 내용은 뒤에서 설명될 것이다
--------------------------------------------------------클래스 정의 끝--------------------------------------------------*
6. 클래스를 기반으로 객체 생성하기
" 위에서 정의한 클래스들은 '틀'에 불과하다. 따라서 접근도 호출도 불가능하다 "-> 정의한 클래스 실체화, 즉 객체화
↓ 자바에서 정의하고 있는 객체 생성방법
ClassName name = new ClassName();
FruitSeller클래스와 FruitBuyer클래스 객체 생성방식 :
FruitSeller seller = new FruitSeller();
FruitBuyer buyer = new FruitBuyer():
1) 대입 연산자의 오른편 new FruitSeller(); / new FruitBuyer();
(1) new : 객체생성 명령하는 명령어. "Fruit~ 객체를 생성하라! "
-> 메모리 공간에 객체 생성. 인스턴스화 (instantiation) , 생성된 객체-인스턴스(intstance)
(2) 클래스와 객체의 차이점 ( 메모리 관점 )
-클래스에 존재하는 변수와 메소드는 메모리 공간에 할당된 형태로 존재 x, 접근도 호출도 불가능.(틀로서만 역할)
-객체는 메모리 공간 할당, 접근과 호출 가능.
2) 대입 연산자의 왼편 FruitSeller seller = ... ; / FruitBuyer buyer = ...;
: int num; 과 같은 선언문과 같은 구조. 자료형(FruitSeller or FruitBuyer)가 왼편, 변수의 이름(seller or buyer) 오른편
- 클래스를 정의하는 것은 자바에서 제공하는 기본 자료형 이외에 프로그래머가 새로운 이름의 자료형을 정의하는 것
3) 객체 생성 문장 총 정리 분석
(1) FruitSeller seller = new FruitSeller(); : FruitSeller 객체를 생성하고 이를 seller라는 이름의 변수로 참초
(2) FruitBuyer buyer = new FruitBuyer(): :FruitBuyer 객체를 생성하고 이를 buyer라는 이름의 변수로 참조
-> 이 두 문장이 실행된 이후로는 각각의 개체에 seller, buyer를 통해서 접근 가능
-> seller & buyer : 참조변수
7. 객체 생성과 참조의 관계

: 키워드 new에 의한 객체 생성시 생성된 객체는 메모리에 저장되고, 저장된 메모리의 주소 값이 반환, 선언된 참조변수에 저장.
- 주소값이 저장되었기 때문에 다음의 문장 구성 가능
FruitSeller seller1=new FruitSeller();
FruitSeller seller2=seller1;
-> 두 개의 참조변수가 하나의 객체를 참조.
** new에 의해 반환되는 주소 값 : 자바에서는 new에 의해 반환되는 주소 값( 참조변수가 저장하고 있는 값 ) 을 '참조' , reference 라고 한다.
===============================객체로의 실체화 끝 =====================================*
8. 생성된 객체의 접근방법
" 연산자를 이용해서 객체의 변수 또는 메소드에 접근한다 " *접근이 가능하려면 접근권한이 있어야 한다. 다음 챕터에서 다룸
1) 참조변수 seller의 예
- seller가 참조하는 객체의 변수 numOfApple에 값 저장하기
seller.numOrApple=20; //seller가 참조하는 객체의 변수 numOfApple에 20저장
- seller가 참초하는 객체의 메소드 호출
seller.saleApple(10); //seller가 참조하는 객체의 메소드 saleApple 호출
9. 참조변수와 메소드의 관계
public void myMethod()
{
FruitSeller seller1 = new FruitSeller();
instMethod(seller1); //seller1 이 메소드의 매개변수로 전달됨!
}
public void instMethod(FruitSeller seller2) //매개변수 형이 FruitSeller이다.
{
...
}
instMethod라는 이름의 메소드 호출, 참조변수 seller1에 저장된 값 전달, instMethod는 seller2라는 이름으로 받음.
메소드를 호출하면서 참조변수를 전달하는 상황에서 생각할 수 있는 값의 전달 진행의 경우
1) 참조변수가 메소드의 인자로 전달되면 동일한 형태의 객체가 생성되어(복사) 매개변수가 이를 별도로 참조. -x
2) seller2에 seller1이 젖아하고 있는 객체의 참조 값(주소 값)이 전달되는 상황. - seller1과 seller2가 하나의 객체를 동시에 참조. -o

- 3~13 : Number라는 이름의 클래스 정의, (클래스 안에 존재하는 메소드와 변수의 위치 상관 x)
- 19 : 객체 생성. 참조변수는 nInst
- 20 : nInst가 참고하는 객체의 getNumber 메소드 호출. -> 객체 내에 존재하는 변수 num값 반환, 0
- 22 : 같은 클래스 내의 25행에 정의되어 있는 메소드를 호출하면서 인자로 nInst가 전달, 호출된 메소드 내에서 매개변수 numb로 이를 받고 있다. 그리고 27행에서는 매개변수 numb를 이용하여 addNum 메소드 호출, -> numb가 참조하는 객체에 저장된 변수 num 값이 12증가
- 23행 : 다시 nInst가 참조하는 객체의 getNumber 메소드 호출
: numb가 참조하고 있는 객체 내의 변수 num를 변경한 뒤 nInst가 참조하고 있는 객체의 변수num을 출력했더니 numb를 이용하여 변화하기 전과 다른 결과가 나왔다. 즉 참조변수 numb와 nInst는 같은 메소드를 참조하고 있음 -> 메소드로의 참조변수 전달은 객체의 주소값만 전달됨.
* 생성되는 class 파일의 수 : 확장자가 .class인 클래스 파일은 정의되는 클래스 수 만큼 생성
10. 참조변수의 null 초기화
: 참조변수 선언 시 특정 개체로 초기화가 이뤄지지 않는다면 null로 초기화 가능
MyInst my=null; //MyInst라는 클래스의 참조변수 my 선언
참조변수 my가 객체를 참조하고 있는지 확인하기 위해 다음과 같은 if문도 구성 가능
if(my==null) System.out.println("참조변수 my는 현재 참조하고 있는 객체가 없습니다.")
+) null로 초기화된 참조변수를 System.out.println메소드로 출력하면 문자열 null이 출력된다.
11. 사과장수 시뮬레이션

-FruitBuyer의 saleApple 메소드 : 구매를 하는데 있어서 필요하지만 클래스 안에 존재하지 않는것 -구매대상(과일장수), 구매금액(2000)
-numOfApple+=seller.saleApple(money); : seller가 참조하는 saleApple가 호출, 반환되는 값의 크기만큼 numOfApple 증가
-buyer.saleApple(seller,2000); : seller가 참조하는 객체는 사과를 판매하고 수익이 생긴다. buyer가 참조하는 객체는 돈을 지불하고 사과를 얻는다. 그 아래에 결과 출력.

12. 객체간의 대화방법(Message Passing방법)
위 시뮬레이션의 numOfApple+=seller.saleApple(money); 는 현실세계에서 " seller아저씨, 사과 2000원 어치 주세요"
( '나' 라는 객체가 '과일장수'라는 객체로 부터 '과일'객체를 구매하는 행위 )
하나의 객체가 다른 하나의 객체에게 메세지를 전달하는 방법은 메소드 호출을 기반으로 함.
->객체지향에서 메세지 전달(Message Passing)이라고 함
13. 객체와 인스턴스
자바에서 객체와 인스턴스는 동일한 의미로 사용. 하지만 표현에 따라 어울리는 상황이 있음.
1) 인스턴스 : 클래스라는 틀을 기바능로 실제화 되었음을 강조할때
" 클래스 FruitSeller의 인스턴스 두 개 생성한다."
2) 객체 : 현실세계의 사물이나 대상을 프로그램상에서 표현되었음을 강조할 때
"과일장수 하시는 옆집 철수 아버님을 의미하는 객체를 생성한다."
+) 클래스 안에서 정의되어서, 인스턴스가 생성되어야만 접근이 가능한 변수와 메소드를 가리켜 각각 '인스턴스 변수', '인스턴스 메소드'라고 한다
* 인스턴스 변수와 인스턴스 메소드 : 메소드라는 이름이 붙은 이유는 메소드가 인스턴스의 행위 및 행동을 표현하는 방법(method)으로 사용되기 때문. 자바에서는 인스턴스 변수를 가리켜 인스턴스 필드(instance field)라고 부르기도 한다.
출처 : 난 정말 JAVA를 공부한 적이 없다구요(윤성우 저)