클래스와객체 클래스와객체 객체 : 우리주변의어떤대상의모델 - 예 : 사람, 차, TV, 개 객체 = 상태 (state) + 행동 (behavior) - 예 : 개의상태 - 종자, 이름, 색개의행동 - 짖다, 가져오다 상태는변수로행동은메소드로나타냄 객체는클래스에의해정의된다. 클래스는객체가생성되는틀혹은청사진이다. 2
예 : 클래스와객체 질문 : 클래스와객체의다른예는? 3 예 : 클래스와객체 클래스 ( 개념 ) 은행계좌 같은클래스로부터여러객체들 객체 ( 실현 ) 갑돌의은행계좌잔고 : 825,000 갑순의은행계좌잔고 : 350,000 지우의은행계좌잔고 : 70,000 4
클래스와객체 클래스 : - 객체의형태를기술한다. - template, 청사진, 혹은주형 - 변수 ( 데이터표현 ), 행동, 그리고상속 객체 : - 클래스의한보기 - 모든객체변수의고유한복사본을가진다 클래스와그클래스의객체사이의차이는데이터형과그형의변수사이의차이와유사 핵심개념 이름짖기관례 : 클래스 : 이름내의각단어의첫자는대문자로시작예 : NeuralNetwork 객체 : 이름내의첫단어의첫자는소문자로시작하고다른단어의첫자는대문자로시작예 : thisobjectidentifier 5 객체지향프로그래밍 구조프로그래밍 (structured programming) 의강력한대안이다 구조프로그래밍은데이터구조들을설계하고그구조들을함수들로처리한다 기본아이디어 : 모든적절한데이터와그데이터를읽거나수정하는메소드들을함께가진객체들을설계한다 6
객체지향프로그래밍이란? 1. 주어진문제를보고필요한객체들을인식하고이들을클래스들로모델한다 2. 필요한클래스들의일부가이미만들어져있다면그클래스들을부품과같이사용한다. 나머지클래스들은새로작성한다. 3. 새로작성하는클래스들사이에유사성이있다면한클래스를또다른클래스에기초하여작성한다. 4. 부품들을조립하여완성품을만드는것과같이클래스들을모아서프로그램을작성한다. 7 클래스 클래스는상태를나타내는데이터선언과행동을나타내는메소드선언을포함한다 int x, y; char ch; 데이터선언 메소드선언 8
클래스의구조 class 클래스이름 { 데이터 ( 변수 ) 선언문들메소드선언들 데이터와메소드들은각각모델하는객체의상태와동작을나타낸다 객체데이터는객체에속하는데이터이다. 데이터는변수들로나타내진다. 9 캡슐화 (Encapsulation) 캡슐화된객체는블랙박스로생각할수있다 내부동작은이용자에게감춰져있다. 이용자는인터페이스메소드만을호출할수있다 이용자 메소드 데이터 10
가시성수정자 가시성수정자는메소드나변수들의특정한특성을명시하는자바의예약어이다 세개의가시성수정자 : public, private, protected public 으로선언된클래스의변수들과메소드들은어디서든지이용될수있다 private 로선언된클래스의변수들과메소드들은그클래스내에서만이용될수있다 protected 수정자는 9 장에서다루어진다 11 메소드의분류 메소드들은크게생성자메소드, 변경자메소드와접근자메소드로나눌수있다 생성자메소드 : 클래스로부터객체를만들때객체변수들의값을초기화한다 변경자메소드는객체변수들의값을바꾼다 접근자메소드는객체변수들의값을되돌려주거나새로운값을계산하여되돌려준다 12
예 : 객체의진화 문제 : 상자를어떻게모델할까? 상자를대표하는속성은무엇일까? 크기, 부피, 무게, 종류, 색? 13 상자모델 1 아이디어 : 상자를가로, 세로, 높이로모델 의사코드 (Pseudocode): length isoftype Num read(length) width isoftype Num read(width) height isoftype Num read(height) volume isoftype Num volume <- length * width * height 장점 : 1. 간단한기법이고특별한기법이아님 단점 : 1. 데이터유형사용안함 2. 재사용이안됨 3. 추상화가전혀안됨 ( 변수명을제외하고는 ) 14
상자모델 2 아이디어 : 상자를나타내는변수를그룹화하여새로운데이터형을정의 Box_Type definesa record length isoftype Num width isoftype Num height isoftype Num volume isoftype Num endrecord this_box isoftype Box_Type read(this_box.length, this_box.width, this_box.height) this_box.volume <- this_box.length * this_box.width*this_box.height 장점 : 1. 데이터의그룹화더나은데이터추상화 : box 를한데이터개체로표현 2. 재사용성이개선됨 : 여러개의상자들을쉽게만들수있다 단점 : 1. 데이터를직접처리 2. 낮은함수추상화 : 데이터처리정의대신에데이터처리방법을생각해야함 15 자바상자모델 Idea: 상자관련변수들과메소드들을포함하는클래스를정의 class Box { int Length; int Width; int Height; 객체변수 public void setlength (int NewLength) { Length = NewLength; public void setwidth (int NewWidth) { Width = NewWidth; 변경자메소드 public int getlength ( ) { return (Length); 접근자메소드 계속 16
자바상자모델 ( 계속 ) public void setheight (int NewHeight) { Height = NewHeight; public int getwidth ( ) { return (Width); 접근자메소드 public int getheight ( ) { return (Height); public int getvolume ( ) { return ( getlength( ) * getwidth( ) * getheight( ) ); 17 자바상자모델 ( 계속 ) // 객체변수들의초기화를수행하는생성자메소드 public Box(int NewLength, int NewWidth, int NewHeight) { setlength(newlength); setwidth(newwidth); setheight(newheight); // of class Box 18
접근자와변경자메소드 접근자 (accessor) 메소드 : get 메소드... ( 메소드명은보통 get 으로시작 ) 객체의상태에대한값을되돌려준다 변수값을되돌려줄수있다 계산되는어떤값을돌려줄수있다 ( 예 : getvolume; Volume 이라는변수가없다 ) 변경자 (modifier) 메소드 : set 메소드... ( 메소드명은보통 set 으로시작 ) 객체의변수값을바꾸는메소드 변수들에대한접근을제한하고그에따라변수값을제어하도록한다 19 생성자메소드 동기 : 우리는객체를만들때새객체의변수들 ( 속성들 ) 을초기화하는수단이필요하다. 수단 : 생성자메소드는객체가만들어질때자동적으로호출되며 new 연산자의일부로서객체의초기화가메모리할당과같이이루어진다. public Box (int NewLength, int NewWidth, int NewHeight) { setlength (NewLength); setwidth (NewWidth); setheight (NewHeight); // 생성자메소드 주 : 이메소드는클래스이름과같은이름을가져야한다. 그러면우리는다음과같이할수있다 : Box subwooferbox = new Box (46, 46, 82); 이는다음과같다 : Box subwooferbox = new Box(); subwooferbox.setlength(46); subwooferbox.setwidth(46); subwooferbox.setheight(82); 20
생성자메소드 생성자메소드는되돌려주는값을가지지않는다 : 다음과같이하지말아라 : public int Person ( ) {... // 임의의코드 // of constructor 절대안됨! public void Person ( ) {... // 임의의코드 // of constructor 되돌려주는값은생성자메소드가아니라는것을의미한다. 21 객체사용하기 클래스의한보기인객체를만들어야한다 다음과같은세과정을포함한다 : 1. 객체를가리키는참조변수를정의한다 : Box thisbox ; 2. 클래스의객체를만든다 : thisbox = new Box( ); 위의두과정은하나로합칠수있다 : Box thisbox = new Box( ); 3. 생성자메소드를통해객체변수들의초기값들을줄수있다 : public Box (int NewLength, int NewWidth, int NewHeight) { setlength (NewLength); setwidth (NewWidth); setheight (NewHeight); 생성자메소드를적절히사용하여위의세과정을한번에할수있다 : Box thisbox = new Box (10, 5, 25); 22
객체사용하기 : 상자객체만들기 class BoxesExample { public static void main (String[ ] argv) { Box shoebox; shoebox = new Box(35, 19, 13); 두번째클래스가 Box 클래스의한보기인객체를만들기위해사용된다. BoxesExample 클래스는 Box cdbox = new Box(14, 9, 10); main 메소드를가지고 int TotalVolumeOfBoxes; 있고한프로그램으로서 TotalVolumeOfBoxes = shoebox.getvolume() 실행된다. + cdbox.getvolume(); System.out.println( The combined volume of the boxes ); System.out.println( is:, TotalVolumeOfBoxes); // of main // of class BoxesExampleProgram 23 객체사용하기 : 상자객체만들기 class BoxesExample { public static void main (String[ ] argv) { Box shoebox; shoebox = new Box(35, 19, 13); Box cdbox = new Box(14, 9, 10); 먼저, shoebox 라는변수를선언한다. 이시점에서, shoebox 는아무것도가리키지않는다. int TotalVolumeOfBoxes; 다음으로, shoebox가 TotalVolumeOfBoxes = shoebox.getvolume() 가리키는한객체를만든다. + cdbox.getvolume(); System.out.println( The combined volume of the boxes ); System.out.println( is:, TotalVolumeOfBoxes); // of main // of class BoxesExampleProgram 24
객체사용하기 : 상자객체만들기 class BoxesExample { public static void main (String[ ] argv) { Box shoebox; shoebox = new Box(35, 19, 13); Box cdbox = new Box(14, 9, 10); int TotalVolumeOfBoxes; TotalVolumeOfBoxes = shoebox.getvolume() + cdbox.getvolume(); System.out.println( The combined volume of the boxes ); System.out.println( is:, TotalVolumeOfBoxes); // of main // of class BoxesExampleProgram 같은과정들이 cdbox 라는변수에대해반복된다. 처음의두과정이한줄로합쳐졌다 : 선언과객체만들기 25 객체사용하기 : 상자객체만들기 class BoxesExample { public static void main (String[ ] argv) { Box shoebox; shoebox = new Box(35, 19, 13); Box cdbox = new Box(14, 9, 10); int TotalVolumeOfBoxes; TotalVolumeOfBoxes = shoebox.getvolume() + cdbox.getvolume(); System.out.print( The combined volume of the boxes ); System.out.println( is:, TotalVolumeOfBoxes); // of main // of class BoxesExampleProgram 또다른변수가선언되고값이주어진다. 주 : 우리는상자에대한정보를접근자메소드들을통해서만얻는다 26
요약 클래스와객체개념 객체지향프로그래밍 객체의진화 객체사용하기 27