[Java] 2020.11.02. day_9 가변인자형, printf, 다형성(Overload,Override), OOP(객체지향), 클래스(작성방법,종류)

2020. 11. 2. 14:40Web_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를 사용한 출력 methodJDK 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

printf 연습 console (빨간점은 자릿수표기를 위해 그림)

 


객체지향언어의 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

console창(좌) / 별찍기 for문을 인덱스화해서 이해하기(우)


◎ 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 작성 순서

  1. 대상선정
  2. 객체모델링(추상화작업)
  3. 클래스작성
  4. 객체생성
  5. 생성된 객체사용

◎ 클래스의 종류

class의 종류 class의 형태 의미  
Class
일반클래스
일을 하기 위한 클래스

instance 변수, static 변수
instance method, static method
 
 
abstrac class
추상클래스

상속을 하기 위한 부모클래스

Interface
인터페이스

-다중상속의 장점을 사용.
-약 결합을 구현하여 객체간의 유연성을 높이기 위해 사용.

Inner class
내부클래스

-Event handling 목적.
-classinstance변수처럼 사용.

 
Nested class

-Event handling 목적.
-classstatic 변수처럼 사용.


nested class를 세가지로 나눈다
static nested class
local inner class(

 

 


 

◎ 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변수만 남는다