contents
CHAPTER06 클래스에 대하여
1.객체지향 언어란?
2.클래스와 객체
1)클래스란?
2)인스턴스(Instance)
3)클래스의 사용
3.인스턴스와 클래스 변수
1)인스턴스 변수
2)클래스 변수
4.메서드
1)메서드란?
2)메서드의 사용
3)메서드의 사용
4)클래스 멤버와 인스턴스 멤버간의 참조 및 호출
5.오버로딩
6.생성자(Constructor)
1)기본 생성자
2)매개변수를 갖고 있는 생성자
Ex) <for 중첩구문: 구구단 프로그램>
<클래스 객체를 활용한 은행 계좌 프로그램>
-----------------------------------------------------------------
CHAPTER06 클래스에 대하여
1.객체지향 언어란?
-객체지향 언어는 여러 가지 문제들을 해결하기 위해 실제 세계를 컴퓨터 속에 구현하고자 하는 노력에서 출발함
-객체지향 언어란 현실에 존재하는 사물과 개념들을 소프트웨어적으로 구현하고, 그 구현된 객체들이 상호작용하여 데이터를 처리하는 방식임. 객체지향 언어는 다음과 같은 특징을 가짐
(1)코드의 재사용성: 새로운 코드를 작성할 때 기존의 코드를 이용함. 이는 코드의 수를 크게 줄일 수 있고 유지 보수하기에도 편리함
(2)신뢰성 높은 프로그래밍: 제어자와 메서드를 사용해서 데이터를 보호함. 또 코드의 중복을 제거하여 오작동을 방지함
(3)코드 관리의 편리함: 객체지향 프로그래밍은 한 부분만 변경하면 관련된 모든 부분이 변경됨. 그렇기 때문에 코드의 관리가 편리함
2.클래스와 객체
-클래스는 객체를 만들기위한 설계도로서, 클래스를 통해 객체를 정의하고 생성함
1)클래스란?
-자동차를 만들기 위해서 자동차의 설계도가 필요하듯이 객체를 만들기 위해서는 객체의 설계도가 필요함. 클래스가 바로 객체의 설계도와 같은 역할을 함. 클래스에는 객체의 속성과 기능들이 정의되어 있고 이를 통해서 객체를 생성함
2)인스턴스(Instance)
-인스턴스(Instance)는 클래스를 통해 만들어진 형태임
-클래스가 객체의 설계도라면 설계도를 통해 실질적으로 만들어진 형태가 인스턴스(Instance)임. 그러므로 클래스를 통해 객체를 만드는 과정을 클래스의 인스턴스화라고 함
3)클래스의 사용
-클래스는 구현하고자 하는 객체의 속성과 기능들을 정의하는 설계도임. 속성을 변수로 나타내고 기능을 메서드(함수)로 나타낸다고 본다면 클래스는 관계있는 변수와 메서드의 집합이라고 볼 수 있음
class 클래스명{ /* 속성(변수) 작성 */ /*기능(메서드) 작성 */ } |
-예를 들어 자동차 객체의 클래스를 작성하려면 자동차의 속성과 기능을 먼저 알아야 함
-자동차의 색, 바퀴의 수, 자동차의 속력이 속성이고 시동, 액셀, 브레이크, 와이퍼 동작이 기능임. 이에 따라 변수와 메서드로 클래스를 작성하면 다음과 같음
Exam-31.java
package ch04;
public class Car { boolean powerOn; //시동 String color; //차량의 색상 int wheel; //바퀴의 수 int speed; //속력 boolean wiperOn; //와이퍼 void power( ) {powerOn = !powerOn;} //시동 메서드 void speedUp( ) {speed++;} //액셀 메서드 void speedDown( ) {speed--;} //브레이크 메서드 void wiper( ) {wiperOn = !wiperOn;} //와이퍼 메서드 } |
*설계도임: 실행x
void: 해당 값이 호출됐을 때 반환x
-자동차의 설계도를 가지고 있다고 해서 자동차를 사용할 수 있는 것은 아님. 실제 자동차를 생산해야만 사용할 수 있음. 즉 클래스로부터 인스턴스를 생성해야 변수와 메서드를 활용함
클래스명 변수명; //클래스의 객체를 참조할 수 있는 참조변수 선언 변수명 = new 클래스명(); //클래스의 객체를 생성하고 객체의 주소를 참조변수에 저장 클래스명 변수명 = new 클래스명(); //한 번에 선언하는 경우 |
-참조변수는 주소를 저장하는 변수임
*int, double, float, char, boolean, byte: 값
그 외 객체: 주소값
-변수라는 개념은 데이터를 저장하는 상자였다면 참조변수는 '데이터가 저장 되어 있는 주소'를 저장하는 특별한 변수임
-연산자 new에 의해서 인스턴스가 메모리의 빈 공간에 생성되고 난 다음 대입 연산자 (=)에 의해서 인스턴스가 저장된 메모리의 주소 값이 참조변수에 저장됨. 인스턴스는 인스턴스의 주소 값이 저장된 참조변수로 다룰 수 있음
-참조변수로 인스턴스에 접근하는 방법은 다음과 같음
변수에 접근할 경우: 참조변수.변수명 ex)s.speed; 메서드를 실행시킬 경우: 참조변수.메서드명(); ex)s.speedUp(); |
-위와 같이 작성하면 참조변수에 있는 주소 값을 통해서 그 메모리에 있는 해당 주소로 접근 함
Exam-32.java
package ch04;
class Car2 { boolean powerOn; //시동 String color; //차량의 색상 int wheel; //바퀴의 수 int speed; //속력 boolean wiperOn; //와이퍼 void power( ) {powerOn = !powerOn;} //시동 메서드 void speedUp( ) {speed++;} //액셀 메서드 void speedDown( ) {speed--;} //브레이크 메서드 void wiper( ) {wiperOn = !wiperOn;} //와이퍼 메서드 } public class Ex32 { public static void main(String[] args) { // TODO Auto-generated method stub Car2 mycar = new Car2(); System.out.println("시동 처음 초기화:" + mycar.powerOn); System.out.println("차의 색상 초기화:" + mycar.color); System.out.println("바퀴의 수 초기화:" + mycar.wheel); System.out.println("속력 초기화:" + mycar.speed); System.out.println("와이퍼 작동 초기화:" + mycar.wiperOn); mycar.power(); //시동 메서드 실행 System.out.println("시동 메서드 동작:" + mycar.powerOn); mycar.power(); //시동 메서드 실행 System.out.println("시동 메서드 다시 동작:" + mycar.powerOn); mycar.color = "black"; //색상 변수에 black 대입 System.out.println("현재 차의 색상:" + mycar.color); } } |
실행결과
시동 처음 초기화:false
차의 색상 초기화:null 바퀴의 수 초기화:0 속력 초기화:0 와이퍼 작동 초기화:false 시동 메서드 동작:true 시동 메서드 다시 동작:false 현재 차의 색상:black |
*같은 패키지 안에 클래스명 중복x(에러) -> 다른 패키지o
다른 패키지에서 가져올 때: import other.Car;
-실제 자동차 인스턴스를 생성하고 다루는 코드임
(1)new 연산자를 통해 Car2인스턴스를 생성하고 mycar라는 car타입의 참조변수에 인스턴스의 주소값을 저장함. 인스턴스를 생성한 직후에는 변수 값들이 각 자료현의 기본 값으로 초기화되는 것을 확인함
(2)시동 메서드를 호출하여 시동 관련 변수 powerOn이 false에서 ture로 바뀜
(3)참조변수 mycar를 통해 변수인 color에 접근해서 데이터의 값을 black으로 변경함
Exam-33.java
package ch04;
public class Ex33 { public static void main(String[] args) { // TODO Auto-generated method stub Car mycar1 = new Car(); //car 인스턴스 생성 Car mycar2 = new Car(); //car 인스턴스 하나더 생성 mycar1.color = "red"; //mycar1의 색상 빨강 mycar2.color = "black"; //mycar2의 색상 검정 mycar1.speedUp(); //mycar1 액셀 메서드 호출 mycar2.wiper(); //mycar2 와이퍼 메서드 호출 System.out.println("mycar1의 색: " + mycar1.color); System.out.println("mycar2의 색: " + mycar2.color); System.out.println("mycar1의 속도: " + mycar1.speed); System.out.println("mycar2의 속도: " + mycar2.speed); System.out.println("mycar1의 와이퍼 작동 여부: " + mycar1.wiperOn); System.out.println("mycar2의 와이퍼 작동 여부: " + mycar2.wiperOn); } } |
실행결과
mycar1의 색: red
mycar2의 색: black mycar1의 속도: 1 mycar2의 속도: 0 mycar1의 와이퍼 작동 여부: false mycar2의 와이퍼 작동 여부: true |
-설계도가 있으므로 인스턴스를 원하는 개수만큼 생성함. 위의 코드는 인스턴스를 두 개 생성하고 각각의 인스턴스에 접근하는 코드임
3.인스턴스와 클래스 변수
-클래스에서 사용되는 변수에는 각각의 객체마다 고유의 값을 가지는 인스턴스 변수와 공통된 값을 공유하는 클래스 변수가 있음
1)인스턴스 변수
-인스턴스 변수는 객체마다 가지는 고유한 변수임. 인스턴스를 생성할 때 만들어지며 인스턴스마다 고유의 저장 공간을 가지므로 각각의 다른 값을 가질 수 있음. 다량의 인스턴스를 생성할 때 인스턴스마다 특별한 값을 가져야 할 경우 인스턴스 변수로 선언함. 인스턴스 변수를 선언하는 방법은 기존의 변수 선언 방법과 같음
class Cars { int speed; //인스턴스 변수 선언 //기존의 방식과 동일! } |
2)클래스 변수
-클래스 변수는 모든 인스턴스가 공통된 값을 공유하는 변수임. 즉 모든 인스턴스가 똑같은 저장 공간을 공유함
-클래스 변수는 클래스가 처음 메모리에 로딩될 때 생성됨. 그러므로 인스턴스를 생성해야 사용할 수 있는 인스턴스 변수와는 달리 클래스 변수는 인스턴스를 생성하지 않아도 사용함. 클래스 변수를 선언하는 방법은 추가로 변수 선언부 맨 앞에 static 키워드를 붙여주면 됨
class Cars { static int wheel; //클래스 변수 선언 } |
(1)new 연산자로 생성하지 않아도 사용 가능, 미리 생성되어 있음
(2)클래스 변수: static 키워드 사용
Exam-34.java
package ch04;
class Cars{ static int wheel = 4; //클래스 변수 int speed; //인스턴스 변수 } public class Ex34 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Cars.wheel); //클래스 변수 접근 가능 // System.out.println(Cars.speed); //에러발생! 인스턴스 변수 접근 불가 Cars myCar1 = new Cars(); System.out.println(Cars.wheel); System.out.println(myCar1.speed); //인스턴스 생성 후에는 접근 가능 Cars myCar2 =new Cars(); System.out.println("<변경 전>"); System.out.println("myCar1.speed: " + myCar1.speed); System.out.println("myCar2.speed: " + myCar2.speed); System.out.println("myCar1.wheel: " + myCar1.wheel); System.out.println("myCar2.wheel: " + myCar2.wheel); myCar2.speed = 100; myCar2.wheel= 5; System.out.println("<변경 후>"); System.out.println("myCar1.speed: " + myCar1.speed); System.out.println("myCar2.speed: " + myCar2.speed); System.out.println("myCar1.wheel: " + myCar1.wheel); System.out.println("myCar2.wheel: " + myCar2.wheel); } } |
실행결과
4
4 0 <변경 전> myCar1.speed: 0 myCar2.speed: 0 myCar1.wheel: 4 myCar2.wheel: 4 <변경 후> myCar1.speed: 0 myCar2.speed: 100 myCar1.wheel: 5 myCar2.wheel: 5 |
-클래스 변수와 인스턴스 변수의 특징을 알아보는 코드임
-바퀴의 수는 자동차마다 고정적이므로 클래스 변수로 선언하고 자동차의 속력은 고유한 값이므로 인스턴스 변수로 선언함
-"클래스명.변수명"으로 wheel 변수를 참조한 것을 참조하여 4를 출력함
-코드는 주석 처리하지 않고 그대로 쓴다면 에러가 발생할 것임. 그 이유는 참조하고 있는 speed변수가 인스턴스 변수이므로 아직 인스턴스가 생성되지 않아서 메모리 상에 존재하지 않기 때문임. 인스턴스 생성 이후에는 참조가 가능한 것을 확인함
-인스턴스를 하나 더 생성함. 결과 창에서 <변경 전>과 <변경 후>를 비교해보면 인스턴스 변수인 speed는 mycar2의 값만 변했지만 wheel변수는 mycar1의 값도 같이 바뀐 것을 확인함
-이를 통해서 인스턴스 변수는 각각의 인스턴스마다 고유의 저장 공간을 가지고 있기 때문에 별개의 조정이 가능하지만 클래스 변수는 하나의 저장 공간을 모든 인스턴스가 함께 공유한다는 것을 알 수 있음. 따라서 하나의 참조변수로 값을 변경하더라도 모든 인스턴스의 값이 변하게 됨
4.메서드
-메서드는 멤버 함수(member function)라고도 불리며, 객체 지향 프로그래밍에서 객체와 관련된 함수로 데이터와 멤버 변수에 대한 접근 권한을 갖음. 메서드는 클래스 기반 언어에서는 클래스 내부에 정의되며, 프로그램이 실행되고 있을 때 클래스에서 생성된 인스턴스와 관련된 동작을 정의함
1)메서드란?
-함수로라고도 불리는 메서드(method)는 특정한 작업이나 논리를 구성하는 코드를 괄호로 묶어 놓은 것임. 메서드는 입력 값을 받아서 내부에서 처리하여 결과를 출력 또는 반환하는 역할을 함
-메서드는 한 번 정해놓으면 언제든지 호출할 수 있고 다른 프로그램에서도 사용함. 이러한 재사용성은 프로그래머에게 상당히 효율적이고 또 코드의 중복을 피할 수 있게 도와줌. 메서드는 실제 현실에서 누군가에게 하는 '함축적인 지시'와 비슷함
2)메서드의 사용
-메서드를 사용하기 위해서는 미리 어떤 작업을 할지 만들어 두어야함
반환타입 메서드명 (타입 변수명, 타입 변수명, ...) { (1) (2) (3) //메서드 내부의 동작 return 값; (4) } |
(1)반환타입은 메서드의 반환 값의 타입을 정해주는 것임. 메서드는 내부의 논리를 통해 처리된 값을 반환 하는데 이 반환하는 값의 타입을 미리 정해주는 것임. 예를 들어 두 개의 정수를 입력받아서 두 수의 합을 int형 정수로 반환한다면 반환타입은 int가 될 것임. 만약 반환하는 값이 없으면 반환 타입은 void로 지정함
(2)메서드명은 자유롭게 지을 수 있으며 소문자로 시작하는 것이 일반적임. 명사가 여러 개 이어진 경우라면 뒤에 오는 명사는 첫 글자를 대문자로 하여 구분함. 메서드의 이름을 지을 때는 의미가 있는 이름을 사용하는 것이 좋음
(3)매개변수는 메서드명 뒤의 괄호 안에 위치함. 타입과 변수명으로 이루어졌으며 파라미터(parameter)라고도 불림. 메서드에서 입력받을 변수의 개수만큼 선언함
(4)return문은 메서드 내부의 결과 값을 반환하는 역할을 함. 반환 타입이 void인 경우를 제외하고는 반드시 메서드 내부에 return문이 포함되어 있어야함. 여러 값을 받을 수 있는 매개변수와는 달리 반환할 수 있는 값은 하나임
<사각형의 넓이를 구하는 메서드를 구현한 것>
Exam-35.java
package ch04;
public class Ex35 { static int calculator(int a, int b) { //static 없으면 오류(메모리 공간이 없기 때문) System.out.println("계산을 시작합니다."); int area = a * b; //밑변 x 높이 = 사각형의 넓이 return area; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(calculator(2, 3)); } } |
실행결과
계산을 시작합니다.
6 |
주의) class 안에 만들어야함 / static 없으면 오류(메모리 공간이 없기 때문)
3)메서드의 사용
-메서드도 클래스 메서드와 인스턴스 메서드로 구분함. 메서드 앞에 static이 붙어 있으면 클래스 메서드이고 그렇지 않으면 인스턴스 메서드임
class Cars { boolean powerOn( ) { } //인스턴스 메서드 static boolean wiperOn( ) { } //클래스 메서드 } |
-클래스 메서드는 객체를 생성하지 않아도 호출이 가능하지만 인스턴스 메서드는 객체를 생성해야만 호출함. 왜냐하면 메서드는 객체가 생성되어야 메모리상에 실제로 존재하고 클래스 메서드는 클래스가 메모리에 올라갈 때 생성되기 때문임
Exam-36.java
package ch04;
class Area{ static void manual(){//static이 있으므로 클래스 매서드 System.out.println("현재 사용 가능한 함수 목록"); System.out.println("triangle: 삼각형의 넓비"); System.out.println("rectangle: 사각형의 넓이"); System.out.println("입니다"); } double triangle(int a, int b) {//삼각형 넓이를 반환하는 메서드 return(double)a*b/2; } int rectangle(int a, int b) {//사각형 넓이 반환하는 메서드 return a*b; } } public class Ex36 { public static void main(String[] args) { // TODO Auto-generated method stub Area.manual(); //클래스 메서드 접근 가능 //Area.triangle(3, 5); 에러발생 //Area.rectangle(3, 4); 에러발생 Area cal = new Area(); cal.manual(); System.out.println(cal.triangle(3, 5)); System.out.println(cal.rectangle(3, 4)); } } |
실행결과
현재 사용 가능한 함수 목록
triangle: 삼각형의 넓비 rectangle: 사각형의 넓이 입니다 현재 사용 가능한 함수 목록 triangle: 삼각형의 넓비 rectangle: 사각형의 넓이 입니다 7.5 12 |
-삼각형과 사각형의 넓이를 구할 수 있는 Area라는 클래스를 만들었음. 클래스를 살펴보면 manual 메서드는 클래스 메서드이고 triangle, rectangle의 메서드는 인스턴스 메서드임. 그러므로 인스턴스 생성 전에는 Area.manual();의 클래스 메서드만 호출이 가능하고 Area cal = new Area(); 에서 인스턴스를 생성한 후에는 참조변수 cal을 총해서 모두 다 호출 가능함
4)클래스 멤버와 인스턴스 멤버간의 참조 및 호출
-클래스 변수와 클래스 메서드를 클래스 멤버, 인스턴스 변수와 인스턴스 메서드를 인스턴스 멤버라고 부름. 같은 클래스에 속한 멤버들끼리는 인스터스를 생성하지 않고 변수를 참조하거나 메서드를 호출함. 하지만 클래스 메서드로 인스턴스 멤버들을 참조하는 것은 에러가 발생함. 그 이유는 클래스 멤버가 존재하는 시점은 처음 클래스가 메모리에 올라갈 때인데 이 시점에서 인스턴스 멤버는 존재하지 않기 때문임
인스턴스 멤버의 클래스 멤버 사용 -> 가능 클래스 멤버의 인스턴스 멤버 사용 -> 에러 인스턴스 멤버의 인스턴스 멤버 사용 -> 가능 클래스 멤버의 클래스 멤버 사용 -> 가능 |
-네 가지 경우 중에 클래스 멤버로 인스턴스 멤버를 사용할 경우에만 에러가 발생함
Exam-37.java
package ch04;
class Check { // instanceVariable: iv // classVariable: cv // instanceMethod: im // classMathod: cm static int cv = 5; // 클래스 변수 int iv = 4; // 인스턴스 변수 static void cm() {// 클래스 메서드 } void im() {// 인스턴스 메서드 } static void cm_Imember() { //클래스 메서드가 인스턴스멤버에 접근 // System.out.println(iv);//에러발생 // im();//에러발생 } void im_Cmember() { //인스턴스 메서드가 클래스 멤버에 접근 System.out.println(cv); cm(); } static void cm_Cmember() { //클래스 메서드가 클래스 멤버에 접극 System.out.println(cv); cm(); } void im_Imember() { //인스턴스 메서드가 인스턴스 멤버에 접근 System.out.println(iv); im(); } } public class Ex37 { public static void main(String[] args) { //Check.cm_Imember(); //에러 Check.cm_Cmember(); //성공 Check myinstance = new Check(); myinstance.im_Cmember(); //성공 myinstance.cm_Imember(); //성공 myinstance.im_Imember(); } } |
실행결과
5
5 4 |
-클래스 멤버와 인스턴스 멤버가 서로 접근이 가능한지 하나씩 테스트해보는 코드임. 결과를 보면 경우의 수 중에 cm_Imember 메서드, 즉 클래스 메서드가 인스턴스 멤버에 접근할 때 에러가 발생함. 이는 아직 인스턴스가 생성되지 않았기 때문에 존재하기 않는 멤버에 접근하는 것과 같기 때문임. 인스턴스 메서드에서 인스턴스 멤버로 접근이 가능한 이유는 인스턴스 메서드를 쓰는 시점에서는 이미 인스턴스가 반드시 생성된 이후일 것이기 때문임
5.오버로딩
-오버로딩(overloading)은 매개변수의 개수와 타입은 다르지만 이름이 같은 메서드를 여러 개 정의하는 것을 말함
-일반적으로 메서드를 사용할 때는 메서드의 이름으로 구분해서 사용함. 하지만 같은 기능을 하는 메서드가 매번 이름이 달라야 한다면 매우 비효율적임
int sum(int a, int b) { return a+b; } |
-두 개의 인자를 받아서 합을 리턴해주는 메서드임. 만약 세 수의 합을 구하고 싶을 때는 새로운 메서드를 선언해야 함
int sum_3(int a, int b, int c) { return a+b+c; } |
-만약 매개변수가 더 늘어나거나 자료형이 달라지면 매번 새로운 메서드 이름을 지정하는 번거로움이 발생함. 그리고 사용자가 매개변수에 따라서 수많은 메서드의 이름을 기억해야 하는 불편함도 있음
-이러한 불편함을 해소하기 위해 오버로딩을 사용함. 오버로딩을 사용하는 방법은 그저 같은 이름의 메서드를 또 선언함
int sum(int a, int b) { return a+b; } int sum(int a, int b, int c) { return a+b+c; } |
-이렇게 작성해놓으면 메서드가 호출될 때 파라미터의 개수와 타입에 따라 자동으로 알맞은 메서드가 호출됨.
Exam-38.java
package ch04;
public class Ex38 { static int sum(int a, int b) { System.out.println("인자가 둘일 경우 호출됨"); return a + b; } static int sum(int a, int b, int c) { System.out.println("인자가 셋일 경우 호출됨"); return a + b + c; } static double sum(double a, double b, double c) { System.out.println("double 타입일 경우 호출됨"); return a + b + c; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(sum(3, 2)); System.out.println(sum(2, 3, 4)); System.out.println(sum(2.5, 3.5, 4.5)); } } |
실행결과
인자가 둘일 경우 호출됨
5 인자가 셋일 경우 호출됨 9 double 타입일 경우 호출됨 10.5 |
-sum이라는 메서드를 오버로딩하고 실제 결과를 확인하는 코드임. 같은 이름의 메서드를 여러 개 작성했지만 오류가 발생하지 않는 것은 매개변수의 타입과 개수로 어느 메서드를 이용할지 구분할 수 있기 때문임. sum(3, 2)에서는 매개변수가 2개이므로 int sum(int a, int b)의 메서드가 호출되어 "인자가 둘일 경우 호출됨" 이라는 문장이 출력되고 결과 값이 반환됨. sum(2, 3, 4)과 sum(2.5, 3.5, 4.5) 역시 매개변수의 개수와 타입에 맞는 메서드가 각각 호출됨
-오버로딩을 사용한 대표적인 메서드가 출력할 때 사용하는 System.out.println( ) 메서드임. println() 메서드로는 숫자, 문자열, boolean 값을 모두 출력함. 이는 println( ) 메서드가 다양한 타입에 대해 오버로딩 되어있기 때문임
-다음은 자바 API 문서 중 일부임
함수 | 설명 |
println( ) | Terminates the current by writing the line separator string |
println(boolean x) | Prints a boolean and then terminate the line |
println(char x) | Prints a character and then terminate the line |
println(char[ ] x) | Prints an array characters and then terminate the line |
println(double x) | Prints a double and then terminate the line |
println(float x) | Prints a float and then terminate the line |
println(int x) | Prints a integer and then terminate the line |
println(long x) | Prints a long and then terminate the line |
println(Object x) | Prints a Object and then terminate the line |
println(String x) | Prints a String and then terminate the line |
-println( )이 여러 타입에 대해 오버로딩 되어있는 것을 알 수 있음. 따라서 println( )의 파라미터로 무엇을 넘기든지 간에 내부적으로 파라미터 타입과 일치하는 메서드가 호출이 됨
6.생성자(Constructor)
-지금까지 인스턴스 변수를 초기화 할 때 참조변수를 통해서 일일이 초기화함.
<기존의 방식 코드>
1. myphone1.color = "gold";
2. myphone1.capacity = "32";
3. myphone1.model = "Galaxy";
4. myphone1.price = 640,000;
-그러나 생성해야할 인스턴스 개수가 많아지면 상당히 번거로워 짐. 그때 생성자라는 개념을 이용하면 편리하게 인스턴스를 생성함
-생성자란 인스턴스를 생성할 때 호출되어 인스턴스 변수들을 초기화하는 일종의 메서드임. 생성자의 이름은 클래스의 이름과 같으며 생성자에는 리턴 값이 없음. 그러므로 반환타입도 붙여주지 않음
1)기본 생성자
클래스 이름( ){ } |
-기본적인 생성자의 구조임. 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 함. 그러나 지금까지 클래스를 작성할 때는 전혀 생성자를 신경쓰지 않았음. 그 이유는 아무런 생성자도 정의되지 않았을 경우 컴파일러가 자동으로 '기본 생성자'를 추가해주기 때문임
class Cellphone{ String model; String color; int capacity; } |
-만약 위와 같은 클래스를 작성했다면 "모든 클래스에는 하나 이상의 생성자가 있어야 한다"라는 조건을 만족시키기 위해서 컴파일러는 자동으로 기본 생성자를 추가함
class Cellphone{ String model; String color; int capacity; Cellphone( ){ } //컴파일시 컴파일러가 자동으로 추가 } |
-컴파일러가 추가한 기본 생성자는 아무 내용도 없으므로 인스턴스에 아무런 영향을 주지 않음. 만약 인스턴스가 생성될 때 필요한 작업이 있으면 기본 생성자 내부에 작성해주면 됨
Cellphone( ){ /* 필요한 작업 */ } |
-생성자를 통해서 인스턴스가 생성될 때 인스턴스 변수를 바로 초기화할 수도 있음
Exam-39.java
package ch04;
class Cellphone{ String model = "Galaxy 8"; String color; int capacity; // Cellphone(){ // // } Cellphone(String color, int capacity){//매개 변수가 있는 생성자 this.color = color; //this.color: 인덱스가 가지고 있는 속성 color, = color; 입력값을 담고 있는 매개변수 color this.capacity = capacity; } } public class Ex39 { public static void main(String[] args) { // TODO Auto-generated method stub // Cellphone myphone1 = new Cellphone(); //에러발생 Cellphone myphone = new Cellphone("Silver", 64); //생성자 호출 System.out.println(myphone.model); System.out.println(myphone.color); System.out.println(myphone.capacity); // System.out.println(myphone1.model);
// System.out.println(myphone1.color); // System.out.println(myphone1.capacity); } } |
실행결과
Galaxy 8
Silver 64 |
2)매개변수를 갖고 있는 생성자
Cellphone(String color, int capacity) { this.color = color; pacity = capacity; } |
-매개변수가 있는 생성자가 작성되면 기본 생성자는 무시됨. 인스턴스를 생성할 때 알맞은 파라미터로 호출하면 이 생성자를 통해 인스턴스가 생성됨. 만약 기본 생성자를 통한 작업이 필요하다면 사용자가 직접 작성해서 사용할 수도 있음
Cellphone( ) { this.color = 'black'; this.capacity = 32; } |
Ex)
<for 중첩구문: 구구단 프로그램>
Exam-for2.java
package ch04;
public class for2 { public static void main(String[] args) { // TODO Auto-generated method stub // int[][] gugudan = new int[8][9]; // // for (int i = 0; i < 8; i++) { // for (int j = 0; j < 9; j++) { // gugudan[i][j] = (i + 2) * (j + 1); // } // } // System.out.println(Arrays.toString(gugudan)); // toString : 얕은 복사 원리 // 2차원 > 주소 // 깊은 복사 원리 // int[][] gugudan2 = new int[][] { // gugudan의 [0]{1, 2, 3, 4}, : 주소[0] : 0 // {5, 6, 7, 8}, : 주소 // {9, 10, 11, 12} : 주소 // }; for (int i = 2; i < 10; i++) { for (int j = 1; j < 10; j++) { System.out.println(i + " x " + j + " = " + i * j); if (j == 5) { break; } } if (i == 2) { break; } } } } |
실행결과
2 x 1 = 2
2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 |
<클래스 객체를 활용한 은행 계좌 프로그램>
package ch04;
import java.util.*; class BankAccount { String accountName; String accountHolder; int currentMoney = 0; BankAccount(String accountName, String accountHolder) { this.accountName = accountName; this.accountHolder = accountHolder; } void deposit(int amount) { if (amount > 0) { currentMoney += amount; System.out.println(amount + "원을 입금하여 잔액이 " + currentMoney + "원입니다. "); } else { System.out.println("입금 금액이 부족합니다."); } } void withdraw(int amount) { if (currentMoney < amount) { System.out.println("출금할 돈이 부족합니다."); } else { currentMoney -= amount; System.out.println(amount + "원을 출금하여 잔액이 " + currentMoney + "원입니다. "); } } void checkMoney() { System.out.println("현재 잔액은 " + currentMoney + "원 입니다."); } void displayAccountInfo() { System.out.println("계좌번호 : " + accountName); System.out.println("예금주 : " + accountHolder); checkMoney(); } } public class ExBankAccount { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); System.out.println("계좌 번호를 입력하세요 : "); String accountName = scanner.nextLine(); System.out.println("예금주 이름을 입력하세요 : "); String holderName = scanner.nextLine(); BankAccount account = new BankAccount(accountName, holderName); /* 최종목적 : 1.입금 2.출금 3.확인 4.종료 에 해당하는 기능 구현 */ while (true) { System.out.println("========== 계좌명 : " + account.accountName + "=========="); System.out.println("1.입금 2.출금 3.확인 4.계좌정보 5.종료"); // System.out.println("2.출금"); // System.out.println("3.확인"); // System.out.println("4.계좌정보"); // System.out.println("5.종료"); System.out.print("원하시는 메뉴를 고르세요 : "); int choice = scanner.nextInt(); if (choice == 1) { System.out.println("얼마를 입금하시겠습니까?"); int depositMoney = scanner.nextInt(); account.deposit(depositMoney); } else if (choice == 2) { int withdrawMoney = scanner.nextInt(); account.withdraw(withdrawMoney); } else if (choice == 3) { account.checkMoney(); } else if (choice == 4) { account.displayAccountInfo(); } else if (choice == 5) { System.out.println("시스템을 종료합니다."); break; } else { System.out.println("해당 메뉴가 없습니다. 다시 입력하세요"); } } scanner.close(); } } |
실행결과
계좌 번호를 입력하세요 :
12344445678 예금주 이름을 입력하세요 : xxx ========== 계좌명 : 12344445678========== 1.입금 2.출금 3.확인 4.계좌정보 5.종료 원하시는 메뉴를 고르세요 : 1 얼마를 입금하시겠습니까? 10000 10000원을 입금하여 잔액이 10000원입니다. ========== 계좌명 : 12344445678========== 1.입금 2.출금 3.확인 4.계좌정보 5.종료 원하시는 메뉴를 고르세요 : 2 5000 5000원을 출금하여 잔액이 5000원입니다. ========== 계좌명 : 12344445678========== 1.입금 2.출금 3.확인 4.계좌정보 5.종료 원하시는 메뉴를 고르세요 : 3 현재 잔액은 5000원 입니다. ========== 계좌명 : 12344445678========== 1.입금 2.출금 3.확인 4.계좌정보 5.종료 원하시는 메뉴를 고르세요 : 4 계좌번호 : 12344445678 예금주 : xxx 현재 잔액은 5000원 입니다. ========== 계좌명 : 12344445678========== 1.입금 2.출금 3.확인 4.계좌정보 5.종료 원하시는 메뉴를 고르세요 : 5 시스템을 종료합니다. |
'프로그래밍 > java' 카테고리의 다른 글
JAVA 프로그래밍 42일차 (25/1/9) (0) | 2025.01.09 |
---|---|
JAVA 프로그래밍 41일차 (25/1/8) (0) | 2025.01.08 |
개발자 환경 구축 40일차 (25/1/7) (0) | 2025.01.07 |