[Java] 2020.11.02. day_9 가변인자형, printf, 다형성(Overload,Override), OOP(객체지향), 클래스(작성방법,종류)
2020. 11. 2. 14:40ㆍWeb_Back-end/Java SE
◎ Variable Arguments (가변인자형)
Variable Arguments | 가변인자형 |
특징 | method 호출할 때 입력하는 값을 동적으로 넣어줄 때 |
Java SE 5(JDK 1.5)에서부터 지원되는 문법. | |
parameter를 정의할 때 “데이터형 … 매개변수명” 의 형식을 가진다. | |
method안에서는 배열로 처리된다 대표 : System.out.printf(); , System.out.format(); |
|
method가 여러 개의 paramter를 정의할 때 가변인자형은 가장 마지막에만 사용할 수 있다. | |
형식 | 접근지정자 반환형 method명( 데이터형 ... 매개변수명 ) { } |
호출 | method명(); method명(값); method명(값, 값, 값,,,,,); |
형식 예 | public void va(int ... paraml){ //...paraml 매개변수는 배열로 처리된다 //(for each 등의 반복문을 사용하여 처음부터 끝까지 모든 값을 얻을 수 있다) for( int value : paraml) { value //입력된 모든 arguments를 사용할 수 있다 } } |
호출 예 | va(); //arguments 없이 호출 가능 va(10); //arguments 하나를 넣어 호출 가능 va(10, 20, 30, 40); //argutments 여러개를 넣어 호출 가능 |
◎ printf
- Variable Arguments를 사용한 출력 method로 JDK 1.5에서 부터 지원
- 출력 메시지와 출력 값을 분리하여 만들 수 있다
- 형식 ) System.out.printf(“출력식” , 값,,,,,,,, );
- 출력식에는 출력 문자가 사용.
- 출력 문자 : %문자
◎ printf 출력 문자의 종류
출력문자 | 출력 값 | 사용예 |
출력 값의 갯수와 문자의 갯수가 같아야함 | ||
%d | 정수상수, 정수변수 | System.out.printf( "%d" , 11 ); System.out.printf( "%d" , "%d", 11 , 2); |
%f | 실수상수, 실수변수 | System.out.printf( "%f" , 11 ); System.out.printf( "%f" , "%f", 50.1 , 2020.11); |
%c | 문자상수, 문자변수 | System.out.printf( "%c" , 'a' ); System.out.printf( "%c" , "%c", 'A' , 'b'); |
%s | 문자열상수,문자열변수 | System.out.printf( "%s" , args[0] ); System.out.printf( "%s" , "%s","안녕" ,args[0]); |
println & printf 의 차이 | ||
println은 값과 출력 메세지가 섞여있다 int year = 2020; int month = 11; System.out.println("오늘은 " + year + "년 " + month + "월 입니다" ); |
||
printf 는 값과 출력 메세지가 분리되어있다 int year = 2020; int month = 11; System.put.printf("오늘은 %d년 %d월 입니다" ,year, month); |
◎ printf _ 출력문자의 자릿수 설정과 실수출력
printf | 출력문자의 자릿수설정과 실수출력 |
출력문자는 자릿수를 설정할 수 있다 | |
형식 | %자릿수문자 "%5d" 5칸으로 설정하여 정수값을 출력 System.out.printf("%5d" , 12); 1 2 "%-5d" 5칸으로 설정하고 왼쪽 정렬로 정수값을 출력 System.out.printf("%-5d" , 12); 1 2 |
실수출력 형식 | 원하는 소수자릿수까지 절삭하여 출력 System.out.prinf("%.2f", 12.1234); 1 2 . 1 2 %전체자릿수.실수자릿수 "%7.2f" 7칸으로 설정하고 소수점 2자리까지만 출력 System.out.printf("%7.2f", 12,1234); 1 2 . 1 2 "%-7.2f" 7칸으로 설정하고 소수점 2자리까지만 왼쪽정렬로 출력 System.out.printf("%-7.2f", 12,1234); 1 2 . 1 2 |
▼ printf 연습해보기 ▼
/**
* JDK 1.5 에서부터 지원되는 Variable Arguments를 사용한 method
* @author owner
*/
public class UsePrintf {
public static void main(String[] args) {
int age = 25;
int year = 2020;
//정수의 출력 : %d 사용
System.out.printf("올해는 %d년이고, 나의 나이는 %d살이다\n", year , age);
//실수의 출력 : %f 사용
System.out.printf("%f %.2f\n", 2020.1102, 2020.1102);
//문자의 출력 : %c 사용
System.out.printf("알파벳의 첫번째는 \"%c\" 한글의 첫번째는 \"%c\"\n", 'A', '가');
//문자열의 출력 : %s 사용
System.out.printf("%s %s입니다\n", "오늘은", "월요일");
//자릿수의 설정 : 양수_오른쪽정렬
System.out.printf("[%4d]\n" , 11);
//자릿수의 설정 : 음수_왼쪽정렬
System.out.printf("[%-4d]\n" , 11);
//printf와 format은 같다
System.out.printf("[%8.1f] [%-8.1f]\n" , 12.345, 12.345);
System.out.format("[%8.1f] [%-8.1f]\n" , 12.345, 12.345);
}//main
}//class
객체지향언어의 3대 특징 | ||
다형성 | 상속 | 캡슐화 |
◎ Polymorphism : 다형성
Polymorphism | 다형성 |
특징 | 하나의 대상을 다양하게 사용하는 것 |
객체지향언어의 3대 특징 중 하나 | |
객체다형성과 method 다형성을 지원 | |
method 다형성 | Overload, Override |
Overload == Overloading (오버로드, 오버로딩) |
|
특징 | 하나의 클래스안에서 같은 이름의 method를 여러개 정의할 수 있는 방법 |
사용하는 이유 | 편의성 향상(개발자와 사용자 모두에게) |
규칙 | 접근지정자, 반환형은 달라도 되고(대부분 동일하게 작성) method명은 같고, 매개변수를 다르게 작성(호출을 다르게 할 수 있다) |
예 ( 이렇게 정의할 수 없음 ) |
class Test{ public void temp(){ //11+2 의 코드 처리 } public void temp(){ //1~100 출력 } } Test t = new Test(); t.temp(); //같은 이름의 method를 정의하지 못하는 이유 //같은 이름의 method가 정의된다면 //해당 method를 호출할 때 //어떤 method가 호출되어야할 지 알지 알수없음_혼란야기_error |
가장 자주 사용했던 method 의 예 |
출력하는 메소드 System.out.println( ); 안에는 정수,실수,문자,문자열 들어갈 수 있다 |
만약 Overload가 지원되지 않았을 때 문제 (같은 이름의 method를 정의할 수 없을 때의 문제) |
◉ 만약 Overload가 지원되지 않았을 때 문제 (같은 이름의 method를 정의할 수 없을 때의 문제) method를 만드는 개발자는 method의 이름을 항상 다르게 만들어야함 class Test( public void printByte(byte b){ } public void printShort(short s){ } public void printInt(int i){ } . . } 사용자 : method를 항상 식별하여 사용해야함 byte b = 10; printInt( b ); //error printByte( b ); //이렇게 사용해야함 |
예 | class Test{ 보통 접근지정자, 반환형 같게 설정한다 public void temp(){ //0. 매개변수없는 method } public void temp( int i ){ //1. Overloading } public void temp( int i, int j ){ //2. Overloading } public void temp( char c ){ //3. Overloading } public void temp( int param ){ //4. Overloading 불가_1번 오버로딩과 같은 형식이기 때문 } } |
호출 | Test t = new Test(); t.temp(); //0.호출 t.temp(11); //호출 불가_1.번 4.번 같은 형식이기 때문에 식별되지 않음 Error 발생 t.temp(2, 30); //2.호출 t.temp('A'); //3.호출 |
▼ Overload 연습해보기 ▼
/**
* Overload<br>
* 같은 이름의 method를 여러개 정의할 수 있는 Overload에 대한 사용
* @author owner
*/
/**
* @author owner
*
*/
public class UseOverload {
/**
* 1. 검은 별 하나를 출력하는 일
*/
public void printStar() {
System.out.print("★");
}//printStar
/**
* 2. 사용자가 입력하는 수대로 흰 별을 출력하는 일
* @param cnt 별의 수
*/
public void printStar(int cnt) {
for(int i=0; i<cnt; i++) {
System.out.print("☆");
}//for end
}//printStar
/**
* 3. 사용자가 입력한 수만큼의 별을 1부터 하나씩 증가시켜 줄바꿈으로 출력하는 method
* @param star 입력한 최종 별의 수
* @param starLine 의미없음(임의로 만듬_2.method와 겹쳐지지않게 오버로딩하기 위해)
*/
public void printStar(int star, int starLine) {
for(int i=0; i<star; i++) {
for(int j=0; j<=i; j++) {
System.out.print("☆");
}
System.out.println("");
}//for end
}//printStar
public static void main(String[] args) {
UseOverload uo = new UseOverload();
//같은 이름의 method로 다른 일을 할 수 있다 : 다형성
//Overload
uo.printStar();
System.out.println("\n---------------");
//별찍는 방법_1. 별을 찍는 method를 정의해서 호출
uo.printStar(4,0);
//별찍는 방법_2. 단순히 별 하나만 찍는 method를 for문 안에 호출하여 출력
for(int i=0; i<4; i++) {
for(int j=0; j<=i; j++) {
uo.printStar();
}
System.out.println("");
}
}//main
}//class
◎ OOP (Object Oriented Programming) _ 객체지향언어
객체지향언어 OOP (Object Oriented Programming) | |
정의 | 실생활에 존재하는 모든 사물을 객체로 보고, 그 사물을 컴퓨터언어로 구현하여 사용하기 적합한 언어 |
특징 | 주로 객체를 생성하여 사용하는 언어 |
3대 특징 | 상속, 다형성, 캡슐화 |
◎ 클래스
- 클래스 : 설계도 _ 대상(현업의 업무)을 구현을 하기 위한 설계도
- Class의 종류 :
- class, abstract class, interface, inner class
- ( inner class, nested class, local class, anonymous inner class)
- class(설계도) --구현--> 객체
※ class 작성 순서
- 대상선정
- 객체모델링(추상화작업)
- 클래스작성
- 객체생성
- 생성된 객체사용
◎ 클래스의 종류
class의 종류 | class의 형태 | 의미 | |
Class 일반클래스 |
![]() |
일을 하기 위한 클래스 instance 변수, static 변수 instance method, static method |
|
abstrac class 추상클래스 |
![]() |
상속을 하기 위한 부모클래스 |
|
Interface 인터페이스 |
![]() |
-다중상속의 장점을 사용. |
|
Inner class 내부클래스 |
![]() |
-Event handling 목적. |
|
Nested class | ![]() |
-Event handling 목적.
|
◎ class 작성해보기_작성순서
class작성 순서 | 예시 | |
1 | 대상선정 | 보드 마카펜_검은색 보드 마카펜, 파란색 보드 마카펜, 빨간색 보드 마카펜 |
2 | 객체모델링(추상화작업) | 대상의 공통특징 추출 마카펜 - 명사적인 특징(눈에 보이는 특징) : 뚜껑, 몸체, 색 - 동사적인 특징(동작 특징) : 쓰는 행위 |
3 | 클래스작성 | 클래스명 변수(값저장) method(업무처리) /** * 마카폔을 대상으로 선정하여 제작된 클래스<br> * 추상화작업: <br> * 명사적인 특징 : 뚜껑, 색, 몸통 * 동사적인 특징 : 화이트보드에 쓰는 일 * @author owner */ public class Maker { private int cap, body; private String color; /** * 동사적인 특징 : 입력받을 메세지를 설정된 색의 마카펜으로 화이트보드에 쓰는 일 * @param msg 메세지 * @return 쓰는 작업 */ public String write(String msg) { return msg + "를 " + color + "색인 마카펜으로 화이트보드에 쓴다"; }//write }//class |
4 | 객체생성 | 클래스를 가지고 객체(구현체) 생성 instance화( 객체화, Object화 ) : memory에 저장 _ (heap, stack, method) 문법) 클래스명 객체명 = new 클래스명(); /** * Maker 클래스를 생성하고 사용하기 위한 클래스 * @author owner */ public class UseMaker { /** * Java Application * @param args */ public static void main(String[] args) { //4. 클래스를 사용하기 위해서는 객체화를 수행 Maker mk = new Maker(); }//main }//class |
5 | 생성된 객체사용 | 객체명. 변수명; 객체명. method명; System.out.println(black.write("안녕하세요")); |
◎ 위의 표를 class diagram으로 나타내기
○ class diagram에서 사용하는 기호(접근지정자)
- + : public
- # : protected
- - : private, default
기능을 구현하는 클래스 | 기능을 구현한 클래스를 생성하여 사용하는 클래스 |
![]() |
|
public class Maker{ private int cap, body; private String color; public String write(String msg){ return "결과"; } } |
public class UseMaker{ public static void main(String[] args){ Maker m = new maker(); m.write(); } } |
○ 클래스 작성 문법
- 접근지정자 class 클래스명 extends 부모클래스명 implements 부모인터페이스명
- 일반클래스의 접근지정자
- public : 패키지 외부에서 접근가능
- package(default) : 패키지 내부에서만 접근가능
- 추상클래스 접근지정자
- abstract
- 상속을 막기 위한 접근지정자
- final
- 중첩클래스
- static
- 일반클래스의 접근지정자
◎ JVM : Java Virtual Machine (_ java.exe)
JVM | ||
method | stack | heap |
실행되는 코드적재 static 변수 저장 |
method를 호출하면 지역변수, parameter저장 |
new를 사용했을 때 저장되는 영역 객체가 저장 |
memory 영역에 들어오는 순서 | ||
1. 기본 class(변수와 메소드가 있는), main method가 있는 class가 로딩됨 main method 호출됨 배열이 만들어짐 args 에 값이 들어있지는 않다 |
2. args가 stack영역으로 들어오게됨 참조하는 주소: method영역에 만들어진 배열의 시작주소를 참조하게됨 |
3. args에 들어있는 변수들이 초기화됨 |
4. 객체화 |
||
5. 객체의 주소가 만들어짐 (2 , 5 를 main frame 이라고 한다) |
이때, 초기화된 변수들이 5.의 (객체)주소를 참조한다 |
|
6. 객체화한 클래스의 변수들을 get,set method를 이용해서 재설정한다 | ||
이때, get,set method를 통해 설정되는 필드는 method명 frame이라고 한다 (예: setName frame) |
||
method호출이 끝나면 지역변수는 사라지고 instance변수만 남는다 |