Day 13

dokiru·2023년 2월 17일
0

학원

목록 보기
11/51

퀴즈 피드백

  • 초기값 설정해주지 않으면 각 타입에 맞는 default값이 들어간다

인스턴스 멤버와 정적 멤버의 구분

  1. 필드
    객체마다 가지고 있어야 하는 필드 -> 인스턴스 필드
    객체마다 가지고 있지 않아도 되는 공용적인 데이터 -> 정적 필드
  1. 메소드
    객체마다 인스턴스 필드를 이용해서 실행해야 한다 -> 인스턴스 메소드
    인스턴스 필드 이용 X -> 정적 메소드

+) 정적 요소는 클래스 이름으로 접근하는 것이 좋다. (객체를 만들지 않고도 사용할 수 있는데 객체를 또 만들면 메모리 낭비)

정적 메소드와 블록 선언 시 주의할 점

  • static 메서드 안에서는 인스턴스 필드, 인스턴스 메서드를 사용할 수 없다 (인스턴스 멤버는 new 연산자와 함께 인스턴스가 만들어졌을 때 그때 만들어진다고 봄)
  • 또한 new 연산자와 함께 만들어진 것이 아니기 때문에 객체 자신의 참조인 this 키워드도 사용이 불가능하다.
  • 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다.
  • static 메서드 안에 static 메서드 O
    static 메서드 안에 인스턴스 메서드 X
    인스턴스 메서드 안에서 static 메서드 O

클래스 생성

  • public이 붙은 class이름이 파일명과 동일해야한다(앞 조건이 충족되면 다른 클래스들도 파일에 여러개 만들 수 있다)

서식 문자열

서식 지정자설명
%dint 정수형 문자
%ffloat, double 실수형 문자
%sString 문자열
%cchar 문자
%o8진 정수 출력
%x16진 정수 출력
%%퍼센트(%) 표시
%n개행문자 표시(\n, \r)

String.format(형식, args)

ex.

int num = 455;
String menuName = "얼큰한 마라탕";
String str1 = String.format("%d번 %s", num, menuName) // 원하는 형식을 쓰고, 각 서식문자열에 들어갈 값을 순서대로 넣어줌
System.out.println(str1);

// 455번 얼큰한 마라탕
  • 서식 문자열 앞에 숫자를 넣어서 일정한 크기를 맞춰주거나, 앞에 -(Hyphen)을 붙여서 왼쪽 정렬 해줄 수 있다
  • string올 곳에 숫자 넣으면 알아서 변환되는데 숫자 올 곳에 string 넣으면 오류 발생

ex.

int[] numArr = {1,2,3};
String[] kindArr = {"한식", "일식", "아시안푸드"};
String[] menuArr = {"콩나물국밥", "돈까스", "베트남소고기쌀국수"};

for (int i = 0; i<3; i++) {
	String str1 = String.format("%d번 %s %s", numArr[i], kindArr[i], menuArr[i]);
    System.out.println(str1);
}

// 결과
1번 한식 콩나물국밥
2번 일식 돈까스
3번 아시안푸드 베트남소고기쌀국수

for (int i = 0; i<3; i++) {
	String str1 = String.format("%3d번 %-10s %-20s", numArr[i], kindArr[i], menuArr[i]);
	System.out.println(str1);
}

// 결과
  1번 한식         콩나물국밥               
  2번 일식         돈까스                 
  3번 아시안푸드      베트남소고기쌀국수           

System.out.printf(형식, args)

  • String.format과 사용 방법이 거의 유사하지만 printf는 값을 출력한다.
  • println과 달리 그 다음 출력 줄이 바뀌지 않는다

출력을 하는 다양한 방법

String 값을 출력한다는 가정
1. 그냥 출력
-> 출력하는 메소드를 만들어서 인스턴스 필드에 있는 값을 출력해준다

  1. String 반환 메소드
    -> formatting된 String을 반환해주는 메소드를 만들어서 출력

  2. static 메소드 : 여러 값을 담고 있는 인스턴스들 만들기
    3-1. 출력해주는 메소드에 출력하고자하는 값을 각각 매개변수로 넘겨주기
    3-2. 인스턴스 하나를 통째로 넣어서 메소드 안에서 그 값들을 쪼개서 접근해서 출력

클래스 타입의 배열

  • 인스턴스들이 담긴 타입을 배열에 담아서 활용할 수도 있다.
  • 배열은 인스턴스들의 주소를 담고 있다.
public class FoodMenu {
	int num; // 번호
	String kind; // 종류
	String name; // 메뉴 이름
	String[] options;
	
	String getName() {
		return name;
	}
	
	String[] getOptions() {
		return options;
	}

	// 생성자
	FoodMenu(int num, String kind, String name) {
		this.num = num;
		this.kind = kind;
		this.name = name;
	}
	
	void printFoodMenuFormat() {
		System.out.println(String.format("%3d번 %s %s", num, kind, name));
	}
	
	public String toString() {
		return String.format("%3d번 %s %s", num, kind, name);
	}
	
	static void printFoodMenu(FoodMenu foodMenu) { // 클래스 변수 객체 자체를 받는다
		// 3개를 각각 받아오던걸 1를 통째로 가져와서 메소드 안에서 쪼갠다
		// 필드변수에 국한된 애가 아니라 foodMenu 타입이면 공통으로 불러와서 안의 값에 접근할 수 있음
		System.out.println(String.format("%3d번 %-10s %-20s", foodMenu.num, foodMenu.kind, foodMenu.name));
	}	
}




--------------------------------------


public class restaurant {
	public static void main(String[] args) {
		FoodMenu[] foodMenuArr = { 
		new FoodMenu(1, "한식", "콩나물국밥"),
    	new FoodMenu(2, "일식", "돈까스"),
		new FoodMenu(3, "아시안푸드", "베트남소고기쌀국수")
		};
    
    	for(int i = 0; i<3; i++) {
    		printFoodMenu(foodMenuArr[i]);
        	// FoodMenu타입의 인스턴스가 담긴 배열을 쪼개서 넣어준다
        	// 인스턴스의 메소드, 필드에 접근 가능
 	   }

	}
}
profile
안녕하세요!

0개의 댓글