자바 프로그래밍 기초 5장. 객체 지향 언어와 클래스, 객체 hanbitbook.co.kr
Chapter 05. 객체지향 언어와 클래스, 객체
학습목표 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드
개요 객체와 클래스의 개념 객체(Object)란 현실 세계에 존재하는 특정 대상을 표현하는 것으로 기능이 유사한 것끼리 모아놓은 집합체다. 예를 들어 컴퓨터, 자동차, 학생 각각 모두 객체라 할 수 있다. 그리고 웹에서의 객체란 작업 대상, 즉 구성요소를 표현하는 문자, 그림, 동영상, 표, 프레임, 윈도우 및 문서 등이다. 객체는 특성을 의미하는 속성(Property)과 실행 명령인 메소드(Method)를 포함한다. 클래스(Class)는 객체의 속성과 메소드를 정의하고 표현하는 방식이며 자바 프로그램의 기본 집합이다. 객체의 이벤트 객체의 이벤트(Event)란 사용자가 외부 세계의 특정 부분을 조작하면 컴퓨터로부터 발생되는 일종의 신호를 말한다. 예를 들면, 마우스 버튼을 더블 클릭하는 행위, 하이퍼텍스트를 위한 링크 위에 마우스를 클릭하는 행위, 사용자가 키보드 등을 누르거나 놓는 행위, 커서를 이동시키는 행위 등을 의미한다.
개요 객체의 속성 객체의 속성(Property)은 객체가 갖고 있는 기본적인 특성을 가리킨다. 예를 들면, 컴퓨터의 규격, 크기, 색상 및 제조회사 등은 모두 속성이다. 웹에서 객체의 속성이란 문자에서는 문자(폰트)의 크기, 색깔 등이며 웹 페이지에서는 전경색, 배경색 등을 의미한다. 객체의 메소드 객체의 메소드(Method)는 객체를 실행시키는 명령이다. 즉, 객체와 외부 세계를 연결해주는 인터페이스(Interface)다. 예를 들면, ‘아이콘 위에서 마우스 왼쪽 버튼을 누르면 윈도우가 화면에 표시된다.’에서 ‘아이콘’은 객체며, ‘왼쪽 버튼을 누른다’는 행위는 이벤트가 발생하며, ‘윈도우가 화면에 표시되는 행위’는 메소드다.
클래스의 선언, 객체의 생성 및 속성 참조 방식 클래스의 선언 및 정의 클래스의 정의는 클래스의 선언을 이용해 표현한다. 클래스의 선언을 위한 일반 형식은 다음과 같다. [ ]로 된 것은 옵션 사항으로 사용할 수도 있고 사용하지 않을 수도 있다. 클래스명의 첫 자는 통상적으로 대문자를 사용한다. [클래스 접근한정자] class 클래스명 [extends 슈퍼클래스명] [implements 인터페이스명] { ... [필드 접근한정자] 멤버 변수; ... [생성자 접근한정자][생성자]; [메소드 접근한정자] 메소드; }
객체의 정의 및 생성 객체 내의 속성 참조 객체의 소멸 객체의 생성은 new 연산자를 이용해 다음과 같이 표현한다. 클래스의 선언, 객체의 생성 및 속성 참조 방식 객체의 정의 및 생성 객체의 생성은 new 연산자를 이용해 다음과 같이 표현한다. 클래스명 객체명; 객체명 = new 클래스명( ); 또는 클래스명 객체명 = new 클래스명( ); 객체 내의 속성 참조 객체 내 속성 참조는 .를 이용해 다음과 같이 표현한다. 객체명.멤버변수명 객체의 소멸 자바는 자동적으로 쓰레기(Garbage)를 수집하기 때문에 C++와 달리 소멸자를 지원하지 않는다.
[실습하기 5-1] 자바의 객체 생성 및 속성 참조 - 결과
[실습하기 5-1] 자바의 객체 생성 및 속성 참조 - 프로그램 01 class Sungjuk_5_1 { 02 String hakbun; 03 String name; 04 int jumsu; 05 } 06 07 class Jv_5_1 { 08 public static void main(String[] args) { 09 Sungjuk_5_1 ken_sung = new Sungjuk_5_1(); 10 ken_sung.hakbun = "2060001"; 11 ken_sung.name = "Ko Eung-Nam"; 12 ken_sung.jumsu = 60; 13 Sungjuk_5_1 wife_sung = new Sungjuk_5_1(); 14 wife_sung.hakbun = "2060002"; 15 wife_sung.name = "Boo Chag-Mi"; 16 wife_sung.jumsu = 80; 17 Sungjuk_5_1 yoo_sung = new Sungjuk_5_1(); 18 yoo_sung.hakbun = "2060003"; 19 yoo_sung.name = "Ko Yoo-Jin"; 20 yoo_sung.jumsu = 100;
[실습하기 5-1] 자바의 객체 생성 및 속성 참조 - 프로그램 21 Sungjuk_5_1 soo_sung = new Sungjuk_5_1(); 22 soo_sung.hakbun = "2060004"; 23 soo_sung.name = "Ko Su-Ji"; 24 soo_sung.jumsu = 99; 25 System.out.println("****** 자바의 객체 생성 및 속성 사용 *****"); 26 System.out.println("*** 자바의 성적 출력 ***"); 27 System.out.println("**학번** **성명** **점수**"); 28 System.out.println("---------------------------"); 29 System.out.println(ken_sung.hakbun + " " + ken_sung.name + " " + ken_sung.jumsu); 30 System.out.println(wife_sung.hakbun + " " + wife_sung.name + " " + wife_sung.jumsu); 31 System.out.println(yoo_sung.hakbun + " " + yoo_sung.name + " " + yoo_sung.jumsu); 32 System.out.println(soo_sung.hakbun + " " + soo_sung.name + " " + soo_sung.jumsu); 33 } 34 }
[실습하기 5-1] 자바의 객체 생성 및 속성 참조 - 해설 01~05행: 클래스의 정의. 클래스의 정의는 클래스의 선언을 이용해 표현한다. 예를 들면, class Sungjuk_5_1 { String hakbun; String name; int jumsu; }에서 Sungjuk_5_1는 클래스명이고 3개의 멤버 변수 hakbun, name, jumsu를 갖고 있는 클래스다. 09, 13, 17, 21행: 객체의 선언 및 생성. new는 객체를 생성하는 연산자다. ken_sung에 대한 객체 생성은 다음과 같다. 여기서 Sungjuk_5_1는 클래스명이고 ken_sung은 객체명이다. Sungjuk_5_1 ken_sung = new Sungjuk_5_1(); wife_sung에 대한 객체 생성은 다음과 같다. 여기서 Sungjuk_5_1는 클래스명이고 wife_sung은 객체명이다. Sungjuk_5_1 wife_sung = new Sungjuk_5_1(); yoo_sung에 대한 객체 생성은 다음과 같다. 여기서 Sungjuk_5_1는 클래스명이고 yoo_sung은 객체명이다. Sungjuk_5_1 yoo_sung = new Sungjuk_5_1(); soo_sung에 대한 객체 생성은 다음과 같다. 여기서 Sungjuk_5_1는 클래스명이고 soo_sung은 객체명이다. Sungjuk_5_1 soo_sung = new Sungjuk_5_1(); 즉, 객체가 정의된 후에 4개의 인스턴스(Instance)가 생성된다. ken_sung, wife_sung, yoo_sung, soo_sung이다.
[실습하기 5-1] 자바의 객체 생성 및 속성 참조 - 해설 10~12행: 객체 내의 속성 생성 및 참조 ken_sung.hakbun = "2060001"; ken_sung.name = "Ko Eung-Nam"; ken_sung.jumsu = 60;에서 인스턴스 ken_sung에 대해서 3개의 속성이 생성된다. 14~16행: 객체 내의 속성 생성 및 참조. 인스턴스 wife_sung에 대해서 3개의 속성이 생성된 다. 18~20행: 객체 내의 속성 생성 및 참조. 인스턴스 yoo_sung에 대해서 3개의 속성이 생성된 다. 22~24행: 객체 내의 속성 생성 및 참조. 인스턴스 soo_sung에 대해서 3개의 속성이 생성된 다. 29~32행: 객체의 속성값 참조. 각 객체의 인스턴스의 속성값을 참조해 System.out.println() 를 이용해 화면에 출력된다.
멤버 변수의 개념 멤버 변수의 종류 객체 변수 멤버 변수 멤버 변수(Member Variable)란 클래스 선언 시에 클래스 내에 메소드와 함께 메소드의 바깥 부분에 선언되는 변수로, 객체의 속성을 표현하는데 사용한다. 멤버 변수의 종류 멤버 변수는 크게 객체 변수, 클래스 변수 및 종단 변수로 구분할 수 있으며, 객체 변수는 객체 속성 변수와 객체 참조 변수로 구분된다. 객체 변수 객체 변수는 객체 속성 변수와 객체 참조 변수로 구분된다. • 객체 속성 변수: 객체 속성 변수는 객체의 속성을 표현하기 위하여 기본 자료형 변수들로 선언되며 그 변수에는 기본 값들이 저장된 다. • 객체 참조 변수: 객체 참조 변수는 그 변수에 객체가 저장된 기억 장소의 주소가 저장된다. 객체 변수의 참조시 일반 형식은 다음과 같다. 객체명.객체변수;
멤버 변수 클래스 변수 클래스 변수는 일명 static 변수라고도하며 클래스의 모든 객체가 공유할 수 있는 변수이다. 클래스 변수는 한정자 static을 앞에 선언한다. 클래스 변수의 참조시 일반 형식은 다음과 같다. 클래스명.클래스변수; 종단 변수 종단(final) 변수는 상수 값을 정의하는 변수며 한번 선언되어 초기화되면 그 값을 변경할 수 없다. 종단 변수 앞에는 final이라는 한정자를 사용하며 통상적으로 대문자를 사용한다. 종단 변수의 일반 형식은 다음과 같다. final 데이터형 종단변수명 = 상수값;
[실습하기 5-2] 클래스 변수 - 결과
[실습하기 5-2] 클래스 변수 - 프로그램 01 class Sungjuk_5_2 { 02 String hakbun; 03 String name; 04 int jumsu; 05 int c_cnt; 06 static int class_cnt = 0; 07 public Sungjuk_5_2() { 08 c_cnt = class_cnt++; 09 } 10 } 11 12 class Jv_5_2 { 13 public static void main(String[] args) { 14 Sungjuk_5_2 ken_sung = new Sungjuk_5_2(); 15 ken_sung.hakbun = "2060001"; 16 ken_sung.name = "Ko Eung-Nam"; 17 ken_sung.jumsu = 60; 18 Sungjuk_5_2 wife_sung = new Sungjuk_5_2(); 19 wife_sung.hakbun = "2060002"; 20 wife_sung.name = "Boo Chag-Mi"; 21 wife_sung.jumsu = 80;
[실습하기 5-2] 클래스 변수 - 프로그램 22 Sungjuk_5_2 yoo_sung = new Sungjuk_5_2(); 23 yoo_sung.hakbun = "2060003"; 24 yoo_sung.name = "Ko Yoo-Jin"; 25 yoo_sung.jumsu = 100; 26 Sungjuk_5_2 soo_sung = new Sungjuk_5_2(); 27 soo_sung.hakbun = "2060004"; 28 soo_sung.name = "Ko Su-Ji"; 29 soo_sung.jumsu = 99; 30 System.out.println("****** 멤버변수 *****"); 31 System.out.println("*** 자바의 성적 출력 ***"); 32 System.out.println("**학번** **성명** **점수** **항목ID**"); 33 System.out.println("---------------------------------"); 34 System.out.println(ken_sung.hakbun + " " + ken_sung.name + " " + ken_sung.jumsu + " " + ken_sung.c_cnt); 35 System.out.println(wife_sung.hakbun + " " + wife_sung.name + " " + wife_sung.jumsu + " " + wife_sung.c_cnt); 36 System.out.println(yoo_sung.hakbun + " " + yoo_sung.name + " " + yoo_sung.jumsu + " " + yoo_sung.c_cnt); 37 System.out.println(soo_sung.hakbun + " " + soo_sung.name + " " + soo_sung.jumsu + " " + soo_sung.c_cnt); 38 System.out.println("---------------------------------"); 39 System.out.println("클래스 전체 접근 갯수: " + Sungjuk_5_2.class_cnt); 40 } 41 }
34~37행: 객체 변수의 속성 생성 및 참조. 객체 변수의 참조시 사용 형식은 다음과 같다. [실습하기 5-2] 클래스 변수 - 해설 멤버 변수란 클래스 선언 시에 클래스 내에 메소드와 함께 메소드의 바깥 부분에 선언되는 변수다. 객체가 가질 수 있는 속성을 표현하는 데 사용된다. 멤버 변수는 크게 객체 변수, 클래스 변수 및 종단 변수로 구분할 수 있으며, 객체 변수는 다시 객체 속성 변수와 객체 참조 변수로 구분된다. 02~05행: 객체 속성 변수. 객체 속성 변수는 객체의 속성을 표현하기 위하여 기본 자료형 변수들로 선언되며 그 변수에는 기본 값들이 저장된다. hakbun, name, jumsu, c_cnt는 객체 속성 변수다. 14행, 18행, 22행, 26행: 객체 참조 변수. 객체 참조 변수는 그 변수에 객체가 저장된 기억 장소의 주소가 저장된다. ken_sung, wife_sung, yoo_sung, soo_sung는 객체 참조 변수다. 34~37행: 객체 변수의 속성 생성 및 참조. 객체 변수의 참조시 사용 형식은 다음과 같다. 객체명.객체변수;
인스턴스 ken_sung에 대해서 3개의 속성이 생성된다. ken_sung.hakbun = "2060001"; [실습하기 5-2] 클래스 변수 - 해설 인스턴스 ken_sung에 대해서 3개의 속성이 생성된다. ken_sung.hakbun = "2060001"; ken_sung.name = "Ko Eung-Nam"; ken_sung.jumsu = 60;에서 인스턴스 ken_sung에 대해서 3개의 속성 이 생성된다. 각 객체의 인스턴스의 속성값을 참조해 System.out.println()를 이용해 화면에 출력된다. System.out.println(ken_sung.hakbun + " " + ken_sung.name + " " + ken_sung.jumsu + " " + ken_sung.c_cnt); 06~09행: 클래스 변수. 클래스 변수는 일명 static 변수라고도하며 클래스의 모든 객체가 공유할 수 있는 변수다. 클래스 변수는 한정자 static을 앞에 선언한다. 클래스 변수의 참조시 사용 형식은 다음과 같다. 클래스명.클래스변수; 여기서 주의할 점은 참조시 ‘객체명’이 아니라 ‘클래스명’으로 참조하는 것이다.
메소드의 개념 객체 내의 메소드 선언 메소드의 참조 메소드 객체의 메소드(method)란 객체를 실행시키는 명령이다. 즉, 객체와 외부 세계를 연결해주는 인터페이스(interface)를 말한다. 예를 들면, ‘아이콘 위에서 마우스 왼쪽 버튼을 누르면 윈도우가 화면에 표시된다.’에서 ‘아이콘’은 객체며, ‘왼쪽 버튼을 누른다’는 행위는 이벤트가 발생하며, ‘윈도우가 화면에 표시되는 행위’는 메소드다. 객체 내의 메소드 선언 [접근한정자] 반환데이터형 메소드명 (매개변수1, ... , 매개변수n) { ... } 메소드의 참조 객체명.메소드명(매개변수1, ... , 매개변수n);
[실습하기 5-3] 자바의 생성 및 객체 내에서의 메소드를 사용 - 결과 [실습하기 5-3] 자바의 생성 및 객체 내에서의 메소드를 사용 - 결과
[실습하기 5-3] 자바의 생성 및 객체 내에서의 메소드를 사용 - 프로그램 01 class Sungjuk_5_3 { 02 String hakbun; 03 String name; 04 int jumsu; 05 void title() { 06 System.out.println("****** 자바의 객체 생성 및 속성 사용 *****"); 07 System.out.println("*** 자바의 성적 출력 ***"); 08 System.out.println("**학번** **성명** **점수**"); 09 System.out.println("---------------------------"); 10 } 11 } 12 13 class Jv_5_3 { 14 public static void main(String[] args) { 15 Sungjuk_5_3 ken_sung = new Sungjuk_5_3(); 16 ken_sung.hakbun = "2060001"; 17 ken_sung.name = "Ko Eung-Nam"; 18 ken_sung.jumsu = 60;
[실습하기 5-3] 자바의 생성 및 객체 내에서의 메소드를 사용 - 프로그램 19 Sungjuk_5_3 wife_sung = new Sungjuk_5_3(); 20 wife_sung.hakbun = "2060002"; 21 wife_sung.name = "Boo Chag-Mi"; 22 wife_sung.jumsu = 80; 23 Sungjuk_5_3 yoo_sung = new Sungjuk_5_3(); 24 yoo_sung.hakbun = "2060003"; 25 yoo_sung.name = "Ko Yoo-Jin"; 26 yoo_sung.jumsu = 100; 27 Sungjuk_5_3 soo_sung = new Sungjuk_5_3(); 28 soo_sung.hakbun = "2060004"; 29 soo_sung.name = "Ko Su-Ji"; 30 soo_sung.jumsu = 99; 31 Sungjuk_5_3 ttt = new Sungjuk_5_3(); 32 ttt.title(); 33 System.out.println(ken_sung.hakbun + " " + ken_sung.name + " " + ken_sung.jumsu); 34 System.out.println(wife_sung.hakbun + " " + wife_sung.name + " " + wife_sung.jumsu); 35 System.out.println(yoo_sung.hakbun + " " + yoo_sung.name + " " + yoo_sung.jumsu); 36 System.out.println(soo_sung.hakbun + " " + soo_sung.name + " " + soo_sung.jumsu); 37 } 38 }
[실습하기 5-3] 자바의 생성 및 객체 내에서의 메소드를 사용 - 해설 05~10행: 생성 및 클래스 사용, 메소드 사용. 객체의 정의는 클래스를 이용해 표현된다. 여기서 Sungjuk_5_2는 클래스명이고 3개의 멤버 변수 hakbun, name, jumsu를 갖고 있고 1개의 메소드 title()를 사용하는 클래스다. 31~32행: 객체의 선언, 생성 및 메소드 이용해 속성 참조. new는 객체를 생성하는 연산자다. ttt에 대한 객체 생성은 다음과 같다. Sungjuk_5_3 ttt = new Sungjuk_5_3();에서 Sungjuk_5_3는 클래스명이고 ttt는 객체명이다. 선언된 메소드는 title()이다. 선언된 메소드를 이용해 속성 참조하는 방법은 new 연산자에 의해서 생성된 객체의 인스턴스명과 . 및 메소드명의 조합으로 표현된다. 예를 들면, ttt.title();처럼 표현된다.
메소드 매개변수 전달 방법 메소드의 호출 과정에서 메소드 간에 전달되는 데이터를 저장하기 위한 변수를 매개변수(parameter) 또는 인수(argument)라고 한다. 인수에는 실인수(actual argument)와 가인수(formal argument) 2종류가 있다. • 실인수: 호출 메소드에 나타나는 인수 • 가인수: 피호출 메소드에 나타나는 인수 실인수와 가인수 사이의 대응 관계는 위치적인 대응 관계를 갖는다. 매개 변수의 전달 방법 : 자바 프로그램에서의 매개변수(parameter variable)의 전달(passing) 방법에는 call-by-value 방식과 call-by-address(call-by-reference) 방식 2가지가 있다. • call-by-value 방식 : 실인수의 값을 가인수에 전달만 해주고 가인수의 변화된 값이 실인수에 영향을 주지 못하는 방식이다. • call-by-address(call-by-reference) 방식 : 실인수의 값을 가인수에 전달 해주고 가인수의 변화된 값이 실인수에 영향을 주는 방식이다. return문은 피호출 메소드에서 호출 메소드로 2개 이상의 값을 되돌려주지 못한다. 이러한 작업을 가능하게하는 방식이 call-by-address이다.
[실습하기 5-4] call-by-value 방식 - 결과
[실습하기 5-4] call-by-value 방식 - 프로그램 01 public class Jv_5_4 { 02 public static void sw1(int x, int y) { 03 int temp; 04 temp = x; 05 x = y; 06 y = temp; 07 System.out.println("sw1 x =" + x + ", new y = " + y); 08 } 09 10 public static void main(String[] args) { 11 System.out.println("***** call-by-value *****"); 12 int x = 20; 13 int y = 50; 14 System.out.println("old x =" + x + ", old y = " + y); 15 sw1(x, y); 16 System.out.println("new x =" + x + ", new y = " + y); 17 } 18 }
[실습하기 5-4] call-by-value 방식 - 해설 15행: 호출 메소드 sw1(x, y);에서 명령 순서가 피호출 메소드 public static void sw1(int x, int y) { int temp; temp = x; x = y; y = temp; System.out.println("sw1 x =" + x + ", new y = " + y); }로 이동된다. 즉, 피호출메소드가 실행된다. 02~08행: 피호출 메소드의 매개 전달 방식: call-by-value 방식. 2개의 정수 x=20, y=50 값을 메소드 sw1()을 이용해 서로 교환하여 결과값을 출력하려는 것이다. 그러나 x, y의 값이 단순하게 메소드 내에 복사되어 전달 되었지만 메소드 내에서 가인수 x, y의 값을 서로 교환했다고 하더라도 메소드 밖에 있는 실인수 x, y에는 영향을 미치지 않는다. 이러한 개념이 call-by-value 방식이다. 또한 return문의 값 2개를 동시에 호출 메소드로 되돌려 줄 수가 없다. 첫번째 return문 만나면 호출 메소드로 되돌아가므로 복수개의 값을 되돌려 주려면 call-by-address 방식을 사용해야 한다.
[실습하기 5-5] call-by-address 방식 - 결과
[실습하기 5-5] call-by-address 방식 - 프로그램 01 class Sw2 { 02 public int x, y; 03 public static void sw2(Sw2 boo) { 04 int temp; 05 temp = boo.x; 06 boo.x = boo.y; 07 boo.y = temp; 08 System.out.println("sw2 x =" + boo.x + ", new y = " + boo.y); 09 } 10 } 11 12 class Jv_5_5 { 13 public static void main(String[] args) { 14 System.out.println("***** call-by-address *****"); 15 Sw2 ken = new Sw2(); 16 ken.x = 20; 17 ken.y = 50; 18 System.out.println("old x =" + ken.x + ", old y = " + ken.y); 19 Sw2.sw2(ken); 20 System.out.println("new x =" + ken.x + ", new y = " + ken.y); 21 } 22 }
[실습하기 5-5] call-by-address 방식 - 해설 15행: 객체의 선언 및 생성. new는 객체를 생성하는 연산자다. ken에 대한 객체 생성은 다음과 같다. Sw2 ken = new Sw2(); 여기서 Sw2는 클래스명이고 ken은 객체명이다. ken.x = 20; ken.y = 50; 객체의 멤버 변수에 x에 20, y에 50을 저장한다. 19행: 호출 메소드 Sw2.sw2(ken);에서 명령 순서가 클래스 Sw2 내에 있는 피호출 메소드 class Sw2 { public int x, y; public static void sw2(Sw2 boo) { int temp; temp = boo.x; boo.x = boo.y; boo.y = temp; System.out.println("sw2 x =" + boo.x + ", new y = " + boo.y); } } 로 이동된다. 즉, 피호출메소드가 실행된다.
[실습하기 5-5] call-by-address 방식 - 해설 03~09행, 16~17행: 피호출 메소드의 매개 전달 방식. call-by-address(call-by-reference) 방식. 2개의 정수 x=20, y=50 값을 메소드 sw2()를 이용해 서로 교환하여 결과값을 출력하려는 것이다. 여기서는 Sw2.sw2(ken);에 의해서 클래스 Sw2 내에 있는 메소드 sw2()에서 x, y 변수가 있는 주소(address) 즉, 객체의 인스턴스명 ken을 실인수로 한다. 피호출메소드 sw2(Sw2 boo)의 의미는 다음과 같다. 가인수는 Sw2 boo, 즉 클래스 Sw2의 객체의 인스턴스명 boo를 가인수로 한다. 2개의 실인수 ken.x의 값이 2개의 가인수 boo.x, boo.y의 값의 교환에 의해서 영향을 받는다. 이러한 개념이 call-by-address(call-by-reference) 방식이다. 즉 return문에 의해서 피호출 함수에서 호출 함수로 2개 이상의 값을 되돌려주지 못했던 작업을 가능하게 하고 있다.
특수한 메소드: main() 메소드 메소드 자바 애플리케이션 실행은 먼저 main() 메소드를 찾고 여기서부터 시작된다. 반드시 접근 한정자 중에서 public을 사용하고, static, 반환값이 없는 void를 main 앞에 사용한다. 매개변수는 String[] args를 사용한다. 함수에 인수를 전달하듯이 프로그램에도 인수를 전달할 수 있다. 즉, main() 메소드에서 명령어 라인(command line)에 입력된 인수를 전달 받는다. 명령어 라인의 구분자는 공백(blank) 문자이다. 프로그램의 인수의 개수는 args.length로 알수 있다. main() 메소드의 일반 형식 public static void main(String[] args) { ...... }
[실습하기 5-6] main() 메소드 - 결과
[실습하기 5-6] main() 메소드 - 프로그램 01 class Jv_5_6 { 02 public static void main(String[] args) { 03 System.out.print("***** main() 메소드 *****"); 04 System.out.print("\n\n"); 05 System.out.print("명령 라인의 전체 문자열: "); 06 for ( int i = 0; i < args.length; i++) 07 System.out.print(args[i] + " "); 08 System.out.print("\n\n"); 09 System.out.println("명령 라인의 전체 문자열 수:" + args.length + "\n\n"); 10 for ( int i = 0; i < args.length; i++) 11 System.out.println("매개변수 args[" + i + "] = " + args[i]); } 12 }
06~07행: args.length로 프로그램의 인수의 개수를 얻을 수 있다. [실습하기 5-6] main() 메소드 - 해설 02행: 특수한 메소드: main() 메소드 자바 애플리케이션 실행은 먼저 main() 메소드를 찾고 여기서부터 시작된다. 반드시 접근한정자 중에서 public을 사용하고, static, 반환값이 없는 void를 main 앞에 사용한다. 매개변수는 String[] args를 사용한다. 06~07행: args.length로 프로그램의 인수의 개수를 얻을 수 있다. Cheju is a fantastic land!이므로 문자열이 5개 있다. 09~11행: 각 문자열의 저장은 매개변수 args[0] = Cheju, 매개변수 args[1] = is, 매개변수 args[2] = a, 매개변수 args[3] = fantastic, 매개변수 args[4] = land! 처럼 되어 있다.
메소드 메소드의 반환값 ‘반환 데이터형’은 메소드를 실행한 후에 반환되는 값에 대한 데이터 형을 지정한다. 데이터 형에는 기본 데이터형인 int, float, String 등을 반환할 수 있고, 참조 데이터형인 객체명도 반환 가능하다. 반환되는 값(return value)이 없는 경우에는 void를 사용한다. 객체 내의 반환데이터형 선언은 메소드명 전에 다음과 같이 표현한다. [접근한정자] 반환데이터형 메소드명 (매개변수1, ... , 매개변수n) { ... }
[실습하기 5-7] 메소드의 여러 가지 사용 - 결과
[실습하기 5-7] 메소드의 여러 가지 사용 - 프로그램 01 class Jv_5_7_1 { 02 public void sub1() 03 { 04 System.out.println("--- no argument ---"); 05 System.out.println("Welcome to JAVA!"); 06 System.out.println("JAVA is very fun!\n"); 07 } 08 public void sub2(int a, int b) 09 { 10 int c; 11 c = a+b; 12 System.out.println("--- argument & no return ---"); 13 System.out.println(a + "+" + b + "=" + c); 14 } 15 public float sub3(int m, int n) 16 { 17 float k; 18 k = m+n; 19 System.out.println("--- argument & return ---"); 20 System.out.println(m + "+" + n + "=" + k); 21 return k; 22 }
[실습하기 5-7] 메소드의 여러 가지 사용 - 프로그램 23 } 24 25 class Jv_5_7 { 26 public static void main(String[] args) { 27 int x, y; 28 float w, z; 29 30 System.out.println("***** no method result *****"); 31 System.out.println("Welcome to JAVA!"); 32 System.out.println("JAVA is very fun!\n"); 33 System.out.print("\n\n"); 34 35 Jv_5_7_1 ken = new Jv_5_7_1(); 36 System.out.println("***** method result *****"); 37 ken.sub1(); 38 39 x=30; 40 y=50; 41 ken.sub2(x, y); 42 43 w = ken.sub3(x,y); 44 z=w+100;
[실습하기 5-7] 메소드의 여러 가지 사용 - 프로그램 45 System.out.println("sub3(x,y)=" + w + ", z=" + z); 46 } 47 }
[실습하기 5-7] 메소드의 여러 가지 사용 - 해설 30~33행: 메소드 사용하지 않는 경우. System.out.println( ) 메소드 이용해 화면에 출력한다. 35~37행. 02~07행: 메소드 사용한 경우(인수 없는 경우). 메소드는 호출 메소드와 피호출 메소드로 구성되어진다. 호출 메소드의 메소드명과 피호출 메소드의 메소드명은 일치해야 한다. 메소드를 사용하려면 메소드명을 사용해야 한다. 메소드명이 발견되면 그 호출메소드에서 피호출 메소드로 실행 제어가 넘겨 주어 피호출 메소드가 실행된다. 실행이 끝나면 제어를 다시 호출 메소드로 넘긴다. 이 때 호출 메소드에서 피호출메소드로 데이터를 넘기기 위해서는 ( )내에 인수가 있어야 한다. 여기서는 인수가 생략된 경우이다.
[실습하기 5-7] 메소드의 여러 가지 사용 - 해설 43~45행, 15~22행: 메소드 사용한 경우(인수도 있고 return값 있는 경우) 호출 메소드가 피호출 메소드에게 처리해야 할 데이터를 넘겨주기 위해서 인수(argument)가 필요하다. 인수에는 실인수(actual argument)와 가인수(formal argument) 2종류가 있다. 실인수의 첫번째 인수는 가인수의 첫번째 인수와 대응, 실인수의 두번째 인수는 가인수의 두번째 인수와 대응된다는 것이다. 즉, 첫번째 실인수의 변수 x의 값 30이 첫번째 가인수의 변수 a에 전달되며 두번째 실인수의 변수 y의 값 50이 두번째 가인수의 변수 b에 전달되어 피호출 메소드 내에서 처리된다. 이때 피호출 메소드내의 가인수 값은 호출 메소드의 실인수로 값이 전달되지 않는다. 즉 피호출 메소드의 계산 결과를 호출 메소드에 돌려주기 위해서 return문 사용을 한다. 즉 변수 c에는 80이 전달된다. 80이 저장된 c는 메소드 sub3()을 실행하고 나면 80을 return한다. z = ken.sub3(x,y);에 의해서 z에 80이 저장된다. 35행: 객체의 선언 및 생성. new는 객체를 생성하는 연산자다. Jv_5_7_1 ken = new Jv_5_7_1();에서 Jv_5_7_1는 클래스명이고 ken은 객체 명이다. 37, 41, 43행: 객체 내의 메소드 참조
메소드 메소드의 오버로딩 메소드의 오버로딩(overloading)이란 하나의 같은 클래스 내에서 같은 이름을 가진 다수의 메소드가 존재 가능한 것을 의미한다. 오버로딩된 메소드들은 매개 변수의 데이터형, 또는 개수가 반드시 달라야 한다. 즉, 메소드의 이름은 동일하지만 그 역할이 다르다는 의미이다. 즉, 컴파일러는 동일한 메소드명이라할지라도 그 다음에 나오는 매개 변수의 데이터형, 또는 개수가 다르면 다르게 인식한다. 동일한 클래스이든 상위 클래스이든 메소드 앞에 static으로 정의된 정적 메소드가 아니면 오버로딩 가능하다. 즉, static으로 정의된 정적 메소드는 오버로딩시킬 수 없다. 메소드의 오버로딩은 객체지향에서의 다형성(polymorpism) 개념을 적용하고 있다. 객체명.메소드명(매개변수1, ... , 매개변수n);
[실습하기 5-8] 메소드의 오버로딩 - 결과
[실습하기 5-8] 메소드의 오버로딩 - 프로그램 01 class Jv_5_8_1 { 02 public void sub() 03 { 04 System.out.println("--- no argument ---"); 05 System.out.println("Welcome to JAVA!"); 06 System.out.println("JAVA is very fun!\n"); 07 } 08 09 public void sub(int a, int b) 10 { 11 int c; 12 c = a+b; 13 System.out.println("--- argument & no return ---"); 14 System.out.println(a + "+" + b + "=" + c + "\n"); 15 } 16 17 public float sub(float m, float n) 18 { 19 float k; 20 k = m+n; 21 System.out.println("--- argument & return ---"); 22 System.out.println(m + "+" + n + "=" + k);
[실습하기 5-8] 메소드의 오버로딩 - 프로그램 23 return k; 24 } 25 } 26 27 class Jv_5_8 { 28 public static void main(String[] args) { 29 int x, y; 30 float c, d, w, z; 31 32 Jv_5_8_1 ken = new Jv_5_8_1(); 33 System.out.println("***** method overloading(메소드 중첩) *****"); 34 35 ken.sub(); 36 37 x=30; 38 y=50; 39 ken.sub(x,y); 40 41 c=30; 42 d=50; 43 w = ken.sub(c, d); 44 z=w+100;
[실습하기 5-8] 메소드의 오버로딩 - 프로그램 45 System.out.println("sub(c, d)=" + w + ", z=" + z); 46 } 47 }
32행: 객체의 선언 및 생성. new는 객체를 생성하는 연산자다. ken에 대한 객체 생성은 다음과 같다. [실습하기 5-8] 메소드의 오버로딩 - 해설 32행: 객체의 선언 및 생성. new는 객체를 생성하는 연산자다. ken에 대한 객체 생성은 다음과 같다. Jv_5_8_1 ken = new Jv_5_8_1();에서 Jv_5_8_1는 클래스명이고 ken은 객체명이다. 35, 02, 39, 09, 43, 17행: 메소드의 오버로딩(overloading) 메소드의 오버로딩(overloading)이란 하나의 같은 클래스 내에서 같은 이름을 가진 다수의 메소드가 존재 가능한 것을 의미한다. 오버로딩된 메소드들은 매개 변수의 데이터형, 또는 개수가 반드시 다르게 되어 있어야 한다. 예를 들면, ken.sub(), ken.sub(x,y), ken.sub(c, d) 들은 서로 오버로딩된 메소드다.
메소드 특수한 메소드: 생성자 생성자의 개념 : 생성자(constructor)는 클래스에서 객체를 생성할 때 객체를 초기화하는 특수한 메소드다. 생성자는 클래스명과 동일한 이름을 사용하며, 특수한 메소드이기 때문에 실행 후에 반환값(return value)이 없다. 생성자의 사용은 클래스 내의 객체 변수들을 초기화시키고자 할 때 사용되며 명시적으로 생성자를 호출하지 않고 new 연산자를 사용해 객체가 생성될 때 자동적으로 호출된다. 생성자에서의 초기화 : 생성자에서의 초기화를 한 경우에는 멤버 변수 선언 시에 초기화한 경우보다 코드를 한쪽에 모아서 관리와 변경이 용이한 장점이 있다. this 예약어 • this는 현재 사용 중인 자기 자신의 객체를 의미한다. • this를 사용하는 경우는 일반적으로 생성자나 메소드의 매개변수 가 클래스 내의 객체 변수명과 동일한 이름을 사용하는 경우에 사 용된다. 만일 생성자나 메소드의 매개변수가 클래스 내의 객체 변 수명과 동일한 이름이 아닌 경우에는 this를 사용하지 않아도 된다.
특수한 메소드: 생성자 메소드 생성자의 오버로딩 • 생성자의 오버로딩(overloading)이란 메소드의 오버로딩처럼 하나 의 같은 클래스 내에서 같은 이름을 가진 다수의 생성자가 존재 가 능한 것을 의미한다. • 오버로딩된 생성자들은 매개 변수의 데이터형, 또는 개수가 반드시 달라야 한다. 즉, 생성자의 이름은 동일하지만 그 역할이 다르다는 의미이다. 즉, 컴파일러는 동일한 생성자명이라할지라도 그 다음 에 나오는 매개 변수의 데이터형, 또는 개수가 다르면 다르게 인식 한다. • 동일한 클래스이든 상위 클래스이든 생성자 앞에 static으로 정의 된 정적 메소드가 아니면 오버로딩 가능하다. • 생성자의 오버로딩은 객체지향에서의 다형성(polymorpism) 개념 을 적용하고 있다.
[실습하기 5-9] 생성자의 오버로딩 - 결과
[실습하기 5-9] 생성자의 오버로딩 - 프로그램 01 class Sungjuk_5_9 { 02 String hakbun; 03 String name; 04 int jumsu; 05 void title() { 06 System.out.println("****** 자바의 생성자(constructor) 사용 *****"); 07 System.out.println("*** 자바의 성적 출력 ***"); 08 System.out.println("**학번** **성명** **점수**"); 09 System.out.println("---------------------------"); 10 } 11 public Sungjuk_5_9() { 12 hakbun = "2060001"; 13 name = "Ko Eung-Nam"; 14 jumsu = 60; 15 } 16 public Sungjuk_5_9(String cons_hakbun) { 17 hakbun = cons_hakbun; 18 name = "Boo Chag-Mi"; 19 jumsu = 80; 20 } 21 public Sungjuk_5_9(String cons_hakbun, String cons_name) { 22 hakbun = cons_hakbun;
[실습하기 5-9] 생성자의 오버로딩 - 프로그램 23 name = cons_name; 24 jumsu = 100; 25 } 26 public Sungjuk_5_9(String hakbun, String name, int jumsu) { 27 this.hakbun = hakbun; 28 this.name = name; 29 this.jumsu = jumsu; 30 } 31 } 32 33 class Jv_5_9 { 34 public static void main(String[] args) { 35 Sungjuk_5_9 ken_sung = new Sungjuk_5_9(); 36 Sungjuk_5_9 wife_sung = new Sungjuk_5_9("2060002"); 37 Sungjuk_5_9 yoo_sung = new Sungjuk_5_9("2060003", "Ko Yoo-Jin"); 38 Sungjuk_5_9 soo_sung = new Sungjuk_5_9("2060004", "Ko Su-Ji", 99); 39 Sungjuk_5_9 ttt = new Sungjuk_5_9(); 40 ttt.title(); 41 System.out.println(ken_sung.hakbun + " " + ken_sung.name + " " + ken_sung.jumsu); 42 System.out.println(wife_sung.hakbun + " " + wife_sung.name + " " + wife_sung.jumsu);
[실습하기 5-9] 생성자의 오버로딩 - 프로그램 43 System.out.println(yoo_sung.hakbun + " " + yoo_sung.name + " " + yoo_sung.jumsu); 44 System.out.println(soo_sung.hakbun + " " + soo_sung.name + " " + soo_sung.jumsu); 45 } 46 }
Sungjuk_5_9 ken_sung = new Sungjuk_5_9(); [실습하기 5-9] 생성자의 오버로딩 - 해설 35~38행: 생성자의 개념 및 생성자의 오버로딩 Sungjuk_5_9 ken_sung = new Sungjuk_5_9(); Sungjuk_5_9 wife_sung = new Sungjuk_5_9("2060002"); Sungjuk_5_9 yoo_sung = new Sungjuk_5_9("2060003", "Ko Yoo- Jin"); Sungjuk_5_9 soo_sung = new Sungjuk_5_9("2060004", "Ko Su-Ji", 99);에서 생성자는 Sungjuk_5_9(), Sungjuk_5_9("2060002"), Sungjuk_5_9("2060003", "Ko Yoo-Jin"), Sungjuk_5_9("2060004", "Ko Su-Ji", 99)이다. 생성자는 클래스에서 객체를 생성할 때 객체를 초기화하는 특수한 메소드다. 생성자는 클래스명 Sungjuk_5_9와 동일한 이름을 사용하며, 특수한 메소드이기 때문에 실행 후에 반환값(return value)이 없다. 성자의 오버로딩(overloading)이란 메소드의 오버로딩처럼 하나의 같은 클래스 Sungjuk_5_9 내에서 같은 이름을 가진 다수의 생성자가 존재 가능한 것을 의미한다. 즉,생성자는 Sungjuk_5_9(), Sungjuk_5_9("2060002"), Sungjuk_5_9("2060003", "Ko Yoo-Jin"), Sungjuk_5_9("2060004", "Ko Su-Ji", 99)들이다. 여기서 오버로딩된 생성자들은 매개 변수의 데이터형, 또는 개수가 다르다. 즉, 생성자의 이름은 동일하지만 그 역할이 다르다는 의미다.
[실습하기 5-9] 생성자의 오버로딩 - 해설 11~15행. 16~20행, 21~25행: 생성자의 생성 및 사용. 생성자의 사용은 클래스 내의 객체 변수들 String hakbun, String name, int jumsu을 초기화시키고자 할 때 사용되며 명시적으로 생성자를 호출하지 않고 Sungjuk_5_9 ken_sung = new Sungjuk_5_9();처럼 new 연산자를 사용해 객체가 생성될 때 자동적으로 호출된다. 26~30행: this 예약어. this는 현재 사용 중인 자기 자신의 객체를 의미한다. this를 사용하는 경우는 일반적으로 생성자나 메소드의 매개변수 this.hakbun, this.name, this.jumsu 각각이 클래스 내의 객체 변수명 hakbun, name, jumsu과 동일한 이름을 사용하는 경우에 사용된다. 만일 생성자나 메소드의 매개변수가 클래스 내의 객체 변수명과 동일한 이름이 아닌 경우에는 this를 사용하지 않아도 된다.
메소드 메소드의 종류 멤버 변수는 크게 객체 변수, 클래스 변수 및 종단 변수로 구분할 수 있으며, 멤버 변수 구분처럼 메소드의 종류도 객체 메소드, 클래스 메소드, 종단 메소드, 추상 메소드 및 동기 메소드 등으로 구분할 수 있다. 객체 메소드: 객체 메소드란 객체를 통하여 접근 가능한 메소드며 통상적인 메소드는 이것을 가리킨다. 클래스 메소드 : 클래스 메소드는 일명 static 메소드라고도 하며 클래스의 모든 객체가 공유할 수 있는 메소드다. 클래스 메소드는 한정자 static을 앞에다 사용해 선언한다. 참조시 ‘객체명’이 아니라 ‘클래스명’으로 참조하는 것이다. 종단 메소드 : 종단(final) 메소드는 서브클래스를 갖지 못한다. 즉, 서브클래스에서 오버라이딩(overriding)될 수가 없는 메소드다. 추상 메소드 : 추상(abstract) 메소드는 추상 클래스 안에서만 선언 가능하며 선언 부분만 가지고 있으며 몸체부분은 가질 수가 없다. 동기 메소드 : 동기(synchronized) 메소드는 스레드를 동기화 가능한 기법을 제공하는 메소드다.
Thank you hanbitbook.co.kr