클래스와객체 이충기 명지대학교컴퓨터공학과
들어가며 Q: 축구게임에서먼저공격하는팀을정하기위해동전을던진다. 우리는동전을던질때앞면이나오느냐아니면뒷면이나오느냐에만관심이있다. 또한동전을가지고해야할일은동전을던지는것과동전을던진후결과를알면된다. 이동전을효과적으로나타낼수있는방법을기술하라. A: 2
클래스와객체 객체 (object): 우리주변의어떤대상의모델이다. - 예 : 학생, 예금계좌, 자동차, 고객 객체 = 데이터 (data) + 연산 (operation) - 예 : 예금계좌 - 데이터 : 예금주, 계좌번호, 잔고 - 연산 : 입금한다, 출금한다, 잔고확인한다, 계좌이체한다 클래스 (class) 는객체가생성되는틀, 원형혹은청사진이다. 객체는클래스에의해정의된다. 객체는클래스의실례 (instance) 이다. 객체의데이터는클래스에서변수로연산은메소드로나타낸다. 3
예 : 클래스와객체 질문 : 클래스와객체의다른예는? 4
예 : 클래스와객체 클래스 ( 개념 ) 은행계좌 같은클래스로부터여러객체들 객체 ( 실현 ) 갑돌의은행계좌잔고 : 825,000 갑순의은행계좌잔고 : 350,000 지우의은행계좌잔고 : 70,000 5
클래스와객체 클래스 : - 객체의형태를기술한다. - 틀, 원형 (template), 혹은청사진 - 변수 ( 데이터표현 ), 연산, 그리고상속 객체 : - 클래스의한실례 (instance) - 모든객체변수의고유한복사본을가진다 클래스와그클래스의객체사이의차이는데이터형과그형의변수사이의차이와유사 핵심개념 이름짖기관례 : 클래스 : 이름내의각단어의첫자는대문자로시작예 : NeuralNetwork 객체 : 이름내의첫단어의첫자는소문자로시작하고다른단어의첫자는대문자로시작예 : thisobjectidentifier 6
객체지향프로그래밍 (Object Oriented Programming) 구조프로그래밍 (structured programming) 의강력한대안이다. 구조프로그래밍은주어진문제를풀기위해데이터구조들을설계하고그구조들을함수들 (functions) 로처리한다. 기본아이디어 : 모든적절한데이터와그데이터를읽거나수정하는메소드들을포함하는클래스들을설계한다. 7
객체지향프로그래밍이란? 1. 주어진문제를보고필요한객체들을인식하고이들을클래스들로모델한다. 2. 필요한클래스들의일부가이미만들어져있다면그클래스들을부품과같이사용한다. 나머지클래스들은새로작성한다. 3. 새로작성하는클래스들사이에유사성이있다면한클래스를또다른클래스에기초하여만든다. 4. 부품들을조립하여완성품을만드는것과같이클래스들을모아서프로그램을완성한다. 8
메시지와메소드 객체지향프로그램은상호작용하는객체들로구성된다. 어떤객체가다른객체에게어떤일을수행하도록명령하기위해서우리는그객체에메시지를보내야한다. 이때메시지는메소드호출에해당한다. 한객체가메시지를처리하기위해서는그것에대응하는메소드가있어야한다. 9
클래스 클래스는데이터를나타내는변수선언문 ( 들 ) 과연산 ( 들 ) 을나타내는메소드정의 ( 들 ) 을포함한다. int x, y; char ch; 변수선언문 메소드정의 10
클래스의구조 클래스는머리부 (header) 와몸체 (body) 로이루어진다. class 클래스이름 { 변수선언문들메소드정의들 변수와메소드는각각모델하는객체의데이터와연산을나타낸다. 변수는객체변수와클래스변수로나누어진다. 객체변수는객체에속하는데이터를나타낸다. 클래스변수는클래스전체에해당되는데이터를나타낸다. 11
메소드의분류 메소드들은크게생성자메소드 (constructor), 변경자 (modifier) 메소드와접근자 (accessor) 메소드로나눌수있다. 생성자메소드 : 클래스로부터객체를만든다. 이때객체변수들의값을초기화할수있다. 변경자메소드 : ( 객체 ) 변수의값을변경한다. 접근자메소드 : ( 객체 ) 변수의값을되돌려 주거나새로운값을계산하여되돌려준다. 12
가시성수정자 가시성수정자 (visibility modifier) 는메소드나변수들의사용범위를명시하는자바의예약어이다. 세개의가시성수정자 : public, private, protected public 으로선언된클래스의변수들과 메소드들은어디서든지이용될수있다. private 로선언된클래스의변수들과메소드들은 그클래스내에서만이용될수있다. protected 수정자는 9 장에서다루어진다. 13
클래스작성 문제 : 대학내에있는한은행의계좌관리프로그램에서은행계좌를나타내야한다. 은행계좌를어떻게모델할까? - 은행계좌를대표하는속성은무엇일까? - 은행계좌에적용가능한연산들은무엇일까? 14
클래스설계 : 은행계좌 대표속성 - 예금주이름 - 잔고 연산 - 예금주이름을주어진값으로변경한다 - 잔고를주어진값으로변경한다 - 예금주이름을알려준다 - 잔고를알려준다 - 주어진금액을입금한다 - 주어진금액을출금한다 - 객체를생성하면서속성데이터를주어진값들로초기화한다 15
구현 : 은행계좌클래스 클래스의이름 : Account 클래스의구조 class Account { // 변수선언문 ( 들 )... // 메소드정의 ( 들 )... 16
예금계좌클래스 class Account { String ownername; int balance; 객체변수 public void setownername(string name) { ownername = name; public void setbalance(int amount) { balance = amount; public void deposit(int amount) { balance = balance + amount; public void withdraw(int amount) { balance = balance - amount; 변경자메소드 계속 17
예금계좌클래스 ( 계속 ) public String getownername( ) { return (ownername); public int getbalance( ) { return (balance); 접근자메소드 // 객체변수들의초기화를수행하는생성자메소드 public Account( String name, int amount) { setownername(name); setbalance(amount): 18
접근자와변경자메소드 접근자 (accessor) 메소드 : get 메소드... ( 메소드명은보통 get 으로시작 ) 객체의데이터에대한값을되돌려준다 변수값을반환할수있다 계산되는어떤값을반환할수있다 변경자 (modifier) 메소드 : set 메소드... ( 메소드명은보통 set 으로시작 ) 객체의변수값을바꾸는메소드 변수들에대한접근을제한하고그에따라변수값을제어하도록한다 19
생성자메소드 동기 : 우리는객체를만들때새객체의변수들을초기화하는수단이필요하다. 수단 : 생성자메소드는객체가만들어질때자동적으로호출되며 new 연산자의일부로서객체의초기화가메모리할당과같이이루어진다. public Account (String name, int amount) { setownername (name); setbalance (amount); 주 : 이메소드는클래스이름과같은이름을가져야한다. 그러면우리는다음과같이할수있다 : Account acct = new Account ( 홍길동, 10000); 이는다음과같다 : Account acct = new Account(); acct.setownername( 홍길동 ); acct.setbalance(10000); 20
생성자메소드 생성자메소드는반환하는값을가지지않는다 : 다음과같이하지말아라 : public int Account ( ) {... // 임의의코드 절대안됨! public void Account ( {... // 임의의코드 반환하는값은생성자메소드가아니라는것을의미한다. 21
객체사용하기 클래스의한보기인객체를만들어야한다. 이는다음과같은세과정을포함한다 : 1. 객체를가리키는참조변수를정의한다 : Account acct; 2. 클래스의객체를만든다 : acct = new Account( ); 위의두과정은하나로합칠수있다 : Account acct = new Account( ); 3. 생성자메소드를통해객체변수들의초기값들을줄수있다 : public Account (String name, int amount) { setownername (name); setbalance (amount); 생성자메소드를적절히사용하여위의세과정을한번에할수있다 : Account acct = new Account ( 홍길동, 10000); 22
객체사용하기 다음으로만들어진객체를이용하여원하는일을수행하기위해서객체의적절한메소드를호출해야한다. 객체메소드호출방법 < 객체를가리키는참조변수명 >.< 객체메소드명 > ( 실매개변수목록 ) 주 : 객체메소드가매개변수를가지고있지않다면실매개변수목록은비게된다. 23
예제 : Account 객체사용하기 문제 : 한예금계좌를개설하여입금과출금을하고난후잔고를출력한다. 설계 변수 : 예금계좌객체참조변수 알고리즘 1. 예금주가 홍길동 이고초기입금액이 10,000 원인새예금계좌를만든다. 2. 이계좌에 3,000 원을입금한다. 3. 이계좌에서 5,000 원을출금한다. 4. 이계좌의현잔고를출력한다. 24
Account 객체사용하기 class Driver { public static void main (String[ ] argv) { Account acct; // 주어진값들을갖는 Account 객체를만든다 acct = new Account( 홍길동, 10000); // 입금한다 acct.deposit(3000); 두번째클래스가 Account 클래스의한보기인객체를만들기위해사용된다. Driver 클래스는 main 메소드를가지고있고한프로그램으로서실행된다. // 출금한다 acct.withdraw(5000); // 잔고를출력한다 System.out.println( 현잔고 : + acct.getbalance()); 25
예금계좌객체사용하기 class Driver { public static void main (String[ ] argv) { Account acct; // 주어진값들을갖는 Account 객체를만든다 acct = new Account( 홍길동, 10000); // 입금한다 acct.deposit(3000); 먼저, acct 라는변수를선언한다. 이시점에서, acct 는아무것도가리키지않는다. 다음으로, acct 가가리키는한객체를만든다. // 출금한다 acct.withdraw(5000); // 잔고를출력한다 System.out.println( 현잔고 : + acct.getbalance()); 26
프로그램실행방법 한프로그램내에여러개의클래스들이있고각클래스가별도의파일에저장되어있는경우우리는그파일들을같은폴더에저장한다. 이경우전체프로그램을실행하기위한과정은다음과같다 : 1. 각클래스를컴파일한다. 2. main 메소드를포함하고있는클래스를실행한다. 27
예제프로그램실행방법 예제프로그램을구성하는 Account.java 와 Driver.java 는같은폴더에별도의파일로저장되어있다고가정한다. 예제프로그램을명령프롬프트에서실행하는과정 : 1. javac Account.java 2. javac Driver.java 3. java Driver 28
요약 클래스와객체개념 객체지향프로그래밍 클래스구조 클래스작성하기 객체사용하기 프로그램실행방법 29