























Chapter 07. 클래스와
인스턴스
07-1.
클래스의정의와인스턴스의생성07-1.
클래스의정의와인스턴스의생성
▶변수.하나의데이터를저장할수있는공간
▶배열.같은타입의여러데이터를저장할수있는공간
▶구조체.타입에관계없이서로관련된데이터들을저장할수있는공간
▶클래스.데이터와함수의결합(구조체+함수)
.데이터저장개념의발전과정
▶변수.하나의데이터를저장할수있는공간
▶배열.같은타입의여러데이터를저장할수있는공간
▶구조체.타입에관계없이서로관련된데이터들을저장할수있는공간
▶클래스.데이터와함수의결합(구조체+함수)
.데이터저장개념의발전과정
.객체지향언어(Object-Oriented Programming Language) 의특징
.기존의프로그래밍언어와크게다르지않다.
.기존의프로그래밍언어에몇가지규칙을추가한것일뿐이다.
.코드의재사용성이높다.
.새로운코드를작성할때기존의코드를이용해서쉽게작성할수있다.
.코드의관리가쉬워졌다.
.코드간의관계를맺어줌으로써보다적은노력으로코드변경이가능하다.
.신뢰성이높은프로그램의개발을가능하게한다.
.접근제어지시자와메소드를이용해서데이터를보호하고, 코드의중복을제거하여코드의불일치로인한오류를방지할수있다.
.객체지향언어(Object-Oriented Programming Language) 의특징
.기존의프로그래밍언어와크게다르지않다.
.기존의프로그래밍언어에몇가지규칙을추가한것일뿐이다.
.코드의재사용성이높다.
.새로운코드를작성할때기존의코드를이용해서쉽게작성할수있다.
.코드의관리가쉬워졌다.
.코드간의관계를맺어줌으로써보다적은노력으로코드변경이가능하다.
.신뢰성이높은프로그램의개발을가능하게한다.
.접근제어지시자와메소드를이용해서데이터를보호하고, 코드의중복을제거하여코드의불일치로인한오류를방지할수있다.
.객체지향프로그래밍과객체
.객체(Object)
.사전적의미: 물건또는대상
.객체지향프로그래밍: 객체중심의프로그래밍객체지향프로그래밍에서는나, 과일장수, 사과라는객체를등장시켜서두개의사과구매라는행위를실체화한다.
“나는과일장수에게두개의사과를구매했다!”
객체객체객체데이터행위, 기능
.객체지향프로그래밍과객체
.객체(Object)
.사전적의미: 물건또는대상
.객체지향프로그래밍: 객체중심의프로그래밍객체지향프로그래밍에서는나, 과일장수, 사과라는객체를등장시켜서두개의사과구매라는행위를실체화한다.
“나는과일장수에게두개의사과를구매했다!”
객체객체객체데이터행위, 기능
.객체를이루는것은데이터와기능입니다.
과일장수는과일을팝니다.
과일장수는사과20개, 오렌지10개를보유하고있습니다.
과일장수의과일판매수익은50,000 원입니다.
행위상태상태과일장수객체의표현과일장수의데이터표현보유하고있는사과의수: i n t n u m O f A p p l e ;
판매수익: i n t m y M o n e y ;
과일장수의행위표현(과일을사고파는상황)
과일장수(객체)와 구매자(객체)
간에 인자(돈)가 전달되고 값의
반환(과일)이 일어나는 상황을
생각해가면서 이해해 볼 것 !
.“ 상태 ”, “ 속성 ”
.변수를 통해 표현
.“ 행위 ”, “ 동작방식 ”
.메소드를 통해 표현
.객체를이루는것은데이터와기능입니다.
과일장수는과일을팝니다.
과일장수는사과20개, 오렌지10개를보유하고있습니다.
과일장수의과일판매수익은50,000 원입니다.
행위상태상태과일장수객체의표현과일장수의데이터표현보유하고있는사과의수: i n t n u m O f A p p l e ;
판매수익: i n t m y M o n e y ;
과일장수의행위표현(과일을사고파는상황)
과일장수(객체)와 구매자(객체)
간에 인자(돈)가 전달되고 값의
반환(과일)이 일어나는 상황을
생각해가면서 이해해 볼 것 !
.“ 상태 ”, “ 속성 ”
.변수를 통해 표현
.“ 행위 ”, “ 동작방식 ”
.메소드를 통해 표현
.클래스(class) 라는틀기반의객체생성FruitSeller 라는이름의틀정의객체생성에앞서선행되어야하는클래스의정의클래스와객체간의관계는붕어빵형틀과붕어빵의관계와같다!
.따라서, 객체생성과정은붕어빵형틀을이용하여붕어빵을만들어내는과정에비유될수있다.
.붕어빵형틀이일단만들어지면, 계속해서붕어빵을만들어낼수있듯이,
일단클래스가정의되고나면, 그해당클래스타입의객체를얼마든지생성가능하다.
.클래스(class) 라는틀기반의객체생성FruitSeller 라는이름의틀정의객체생성에앞서선행되어야하는클래스의정의클래스와객체간의관계는붕어빵형틀과붕어빵의관계와같다!
.따라서, 객체생성과정은붕어빵형틀을이용하여붕어빵을만들어내는과정에비유될수있다.
.붕어빵형틀이일단만들어지면, 계속해서붕어빵을만들어낼수있듯이,
일단클래스가정의되고나면, 그해당클래스타입의객체를얼마든지생성가능하다.
.‘ 과일장수 ’ 클래스 정의와 키워드 final
변수APPLE_PRICE 를상수화한다.
과일판매기능의표현오늘좀많이파셨어요? 에대한대답변수를상수화시키는JAVA 키워드(final 로지정되면, 더이상값을변화시킬수없다라는의미)
.‘ 과일장수 ’ 클래스 정의와 키워드 final
변수APPLE_PRICE 를상수화한다.
과일판매기능의표현오늘좀많이파셨어요? 에대한대답변수를상수화시키는JAVA 키워드(final 로지정되면, 더이상값을변화시킬수없다라는의미)
.‘ 나 (me)’ 클래스 정의
과일구매자관점에서의나!
소유현금소유과일과일구매행위의표현네가가지고있는돈과과일의수는?
.‘ 나 (me)’ 클래스 정의
과일구매자관점에서의나!
소유현금소유과일과일구매행위의표현네가가지고있는돈과과일의수는?
.클래스를기반으로객체생성하기인스턴스(=객체)의생성참조변수의선언붕어빵은붕어빵형틀을통하여만들어진다(=실체화된다/ 인스턴스화된다)
=> 객체는클래스를통하여만들어진다(=실체화된다/ 인스턴스화된다)
Ex) int a = 5; 와비교해생각해볼것!
변수이름(객체를참조하기위해사용하는변수)
=> 객체명or 참조변수자료형(사용자정의자료형)
=> 클래스명
.클래스를기반으로객체생성하기인스턴스(=객체)의생성참조변수의선언붕어빵은붕어빵형틀을통하여만들어진다(=실체화된다/ 인스턴스화된다)
=> 객체는클래스를통하여만들어진다(=실체화된다/ 인스턴스화된다)
Ex) int a = 5; 와비교해생각해볼것!
변수이름(객체를참조하기위해사용하는변수)
=> 객체명or 참조변수자료형(사용자정의자료형)
=> 클래스명
.객체생성과참조의관계를정확히말하라!
참조변수의역할이경우, 참조변수seller 는C/C++ 에서의포인터변수에해당됨. 즉, seller 변수에는객체가저장된메모리상의주소값이저장되어있고, 이주소정보를통하여객체에접근하게된다.
(JAVA 에서는C/C++ 과달리, 메모리를직접접근하는방식을허용하지도않으며, 그러할필요도없다. )
하나의객체는둘이상의참조변수를통하여얼마든지참조가능하다!
(상단및하단의그림을각각꼭이해할것!)
.객체생성과참조의관계를정확히말하라!
참조변수의역할이경우, 참조변수seller 는C/C++ 에서의포인터변수에해당됨. 즉, seller 변수에는객체가저장된메모리상의주소값이저장되어있고, 이주소정보를통하여객체에접근하게된다.
(JAVA 에서는C/C++ 과달리, 메모리를직접접근하는방식을허용하지도않으며, 그러할필요도없다. )
하나의객체는둘이상의참조변수를통하여얼마든지참조가능하다!
(상단및하단의그림을각각꼭이해할것!)
.생성된객체의접근방법Fruitseller seller = new FruitSeller();
seller.numOfApple=20;
객체내에존재하는변수의접근Fruitseller seller = new FruitSeller();
seller.saleApple(10);
객체내에존재하는메소드의접근(호출)
.seller 가참조하고있는객체안에존재하는numOfApple 변수에20을대입하라!
.seller 가참조하고있는객체안에존재하는saleApple() 메소드의인수로서10을전달하라!
참조변수(객체명)
.참조변수(객체명)를사용하여변수와메소드에접근
.생성된객체의접근방법Fruitseller seller = new FruitSeller();
seller.numOfApple=20;
객체내에존재하는변수의접근Fruitseller seller = new FruitSeller();
seller.saleApple(10);
객체내에존재하는메소드의접근(호출)
.seller 가참조하고있는객체안에존재하는numOfApple 변수에20을대입하라!
.seller 가참조하고있는객체안에존재하는saleApple() 메소드의인수로서10을전달하라!
참조변수(객체명)
.참조변수(객체명)를사용하여변수와메소드에접근
.참조변수와메소드의관계seller1 이갖고있는참조정보를seller2 에전달해줌(값이메소드의매개변수에복사되어전달되는Call by value 방식이아니라, Call by
reference 방식임에주의!)
매개변수의자료형으로기본자료형뿐만아니라,
사용자정의자료형(클래스)도올수있다.
.참조변수와메소드의관계seller1 이갖고있는참조정보를seller2 에전달해줌(값이메소드의매개변수에복사되어전달되는Call by value 방식이아니라, Call by
reference 방식임에주의!)
매개변수의자료형으로기본자료형뿐만아니라,
사용자정의자료형(클래스)도올수있다.
.참조변수와메소드의관계확인을위한예제실행결과인스턴스변수(=클래스내에선언된멤버변수)
인스턴스메소드(=클래스내에선언된멤버메소드)
.참조변수와메소드의관계확인을위한예제실행결과인스턴스변수(=클래스내에선언된멤버변수)
인스턴스메소드(=클래스내에선언된멤버메소드)
.참조변수의null 초기화null 은아무것도참조하지않음을의미하는키워드
.참조변수의null 초기화null 은아무것도참조하지않음을의미하는키워드
.사과장수시뮬레이션완료!
메소드 호출 → 구매자 객체가 판매자 객체에게 메시지 전달 (message passing)
메시지 전달은 두 객체간의 대화방법이다 . 위 예제에서의 buyApple 메소드가
의미하는 바는 다음과 같다 .
=> “ 아저씨 사과 2000원어치 주세요 !"
FruitBuyer 클래스 내에 정의된
buyApple 메소드
(교재 p186, 187 의 전체소스코드
확인요망!)
// 구매자사과수증가시킴// 구매자보유금액을감소시킨다// 판매자객체생성// 구매자객체생성교재p186에서메소드의의미를확인해볼것
.사과장수시뮬레이션완료!
메소드 호출 → 구매자 객체가 판매자 객체에게 메시지 전달 (message passing)
메시지 전달은 두 객체간의 대화방법이다 . 위 예제에서의 buyApple 메소드가
의미하는 바는 다음과 같다 .
=> “ 아저씨 사과 2000원어치 주세요 !"
FruitBuyer 클래스 내에 정의된
buyApple 메소드
(교재 p186, 187 의 전체소스코드
확인요망!)
// 구매자사과수증가시킴// 구매자보유금액을감소시킨다// 판매자객체생성// 구매자객체생성교재p186에서메소드의의미를확인해볼것
.중요점검사항
.클래스설계(정의) 방법/ 클래스와객체관계: 슬라이드page 6, 7
.객체생성방법: 슬라이드page 10, 11
.생성된객체접근방법(인스턴스변수접근, 인스턴스메소드접근) :
슬라이드page 12
.참조변수와메소드의관계: 슬라이드page 13, 14
.객체간의통신방법(message passing / 객체간에메시지주고받기):
슬라이드page 16
.중요점검사항
.클래스설계(정의) 방법/ 클래스와객체관계: 슬라이드page 6, 7
.객체생성방법: 슬라이드page 10, 11
.생성된객체접근방법(인스턴스변수접근, 인스턴스메소드접근) :
슬라이드page 12
.참조변수와메소드의관계: 슬라이드page 13, 14
.객체간의통신방법(message passing / 객체간에메시지주고받기):
슬라이드page 16
07-2. 생성자(Constructor) 07-2. 생성자(Constructor)
.두명의과일장수와한명의구매자서로다른인스턴스의생성은, 인스턴스변수의초기화라는문제를고민하게한다.
바람직하지않다!
final 이빠지므로..
초기화과정의불편함..
APPLE_PRICE 의값이변경되어야하므로final 이빠진다.
객체생성따로, 초기화따로하면불편하다! => 객체생성시한번에초기화까지될수있는방법이좋다.
초기화용도의메소드
.두명의과일장수와한명의구매자서로다른인스턴스의생성은, 인스턴스변수의초기화라는문제를고민하게한다.
바람직하지않다!
final 이빠지므로..
초기화과정의불편함..
APPLE_PRICE 의값이변경되어야하므로final 이빠진다.
객체생성따로, 초기화따로하면불편하다! => 객체생성시한번에초기화까지될수있는방법이좋다.
초기화용도의메소드
.딱한번만호출되는메소드! 생성자!
실행결과<생성자의조건>
자바객체생성시, 생성자는반드시호출된다!
인자값을전달받지않는Number 라는이름의생성자를호출하면서Number 클래스의객체(인스턴스)를생성하라는의미임
.딱한번만호출되는메소드! 생성자!
실행결과<생성자의조건>
자바객체생성시, 생성자는반드시호출된다!
인자값을전달받지않는Number 라는이름의생성자를호출하면서Number 클래스의객체(인스턴스)를생성하라는의미임
.값을전달받는생성자호출되는생성자만일인자값을전달받는생성자를사용하려면반드시클래스내에인자값을전달받는생성자가정의되어져있어야함생성자내에서는final 멤버변수의초기화가가능함
.값을전달받는생성자호출되는생성자만일인자값을전달받는생성자를사용하려면반드시클래스내에인자값을전달받는생성자가정의되어져있어야함생성자내에서는final 멤버변수의초기화가가능함
.디폴트생성자(Default Constructor)
생성자가없어도인스턴스생성이가능한이유는자동으로삽입되는디폴트생성자에있다.
호출되는디폴트생성자생성자를정의하지않았을때에만삽입!
사용자가생성자를정의하지않았을경우, 자바컴파일러가알아서생성자를자동삽입해준다.
하지만, 생성자를정의해두는것이바람직하다.
.디폴트생성자(Default Constructor)
생성자가없어도인스턴스생성이가능한이유는자동으로삽입되는디폴트생성자에있다.
호출되는디폴트생성자생성자를정의하지않았을때에만삽입!
사용자가생성자를정의하지않았을경우, 자바컴파일러가알아서생성자를자동삽입해준다.
하지만, 생성자를정의해두는것이바람직하다.
07-3.
자바의이름규칙(Naming Rule)
07-3.
자바의이름규칙(Naming Rule)
.클래스, 메소드, 상수의이름규칙
.int addYourMoney(int money)
.int yourAge
.class MyClass
.class ProgrammingBook
.final int COLOR=7
.final int COLOR_RAINBOW=7
클래스이름인스턴스변수, 메소드이름상수이름Camel Case
첫글자를대문자로시작둘이상의단어가묶여서하나의이름구성시,
새단어의첫글자는대문자로시작변형된Camel Case
첫글자를소문자로시작둘이상의단어가묶여서하나의이름구성시,
새단어의첫글자는대문자로시작전부대문자로표현둘이상의단어가묶여서하나의이름구성시,
두단어사이에_ 삽입
.클래스, 메소드, 상수의이름규칙
.int addYourMoney(int money)
.int yourAge
.class MyClass
.class ProgrammingBook
.final int COLOR=7
.final int COLOR_RAINBOW=7
클래스이름인스턴스변수, 메소드이름상수이름Camel Case
첫글자를대문자로시작둘이상의단어가묶여서하나의이름구성시,
새단어의첫글자는대문자로시작변형된Camel Case
첫글자를소문자로시작둘이상의단어가묶여서하나의이름구성시,
새단어의첫글자는대문자로시작전부대문자로표현둘이상의단어가묶여서하나의이름구성시,
두단어사이에_ 삽입