TIL - 2022.01.17 ~ 22

YulHee Kim·2022년 1월 17일
0
post-thumbnail

01.17 월

자바와 웹서버에 대한 지식을 공부했다.

✏️ printf()와 지시자

자바 100제

System.out.print(), println(), printf() 등에 대해서 예제를 통해 설명해보시오
+10진수 10에 대해 8진수, 16진수로 각각 출력해보시오

  • printf() 출력 -> 지시자를 사용
    : %d(정수), %f(소수), %c(문자), %s(문자열), %b(부울), %n(줄바꿈), %e(지수), %o(8진수), %x(16진수)
System.out.println("개행");
System.out.print("개행 X ");

int b = 2022;
System.out.printf("올해는 %d년입니다.", b);

int b = 10;
System.out.printf("10진수 10은 8진수로는 %o이고, 16진수로는 %x이다.", b, b);

✏️ 정수형을 문자열로 변환

정수형을 문자열로 변환하여 정수의 자릿수를 구하는 코드를 구현해보시오


int a = 12345;
String str = "123";

//System.out.println(a.length()); //Err
System.out.println(str.length()); //5

// 정수 -> 문자열로 변환 -> 자릿수 구하기
String stra = String.valueOf(a);
System.out.println(stra.length()); //5

// 문자열 + 정수형 = ?
System.out.println(12345 + 1);  //12346
System.out.println(str + 1);  //123451

// 문자열 -> 정수로 변환
int b = Integer.valueOf(str);

그외 반복문에 관련한 문제를 풀었다

✏️ Apache 와 Nginx

참고 강의 : 풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포)

✔️ 웹서버

  • 웹서버는 HTTP 요청을 읽어서, 응답을 해주는 프로그램
  • 웹서버 프로그램을 서버상에 설치하여, 특정 HTTP 요청에 따라, 서비스를 제공해주는 방식으로 웹서비스를 구현
  • 상용으로 많이 쓰이는 웹서버 프로그램은 크게 apache와 nginx가 있음

✔️ Apache vs Nginx

  • Apache는 오픈 소스 프로젝트로 가장 유명한 프로그램 중 하나
  • 수십년간 웹서버 프로그램으로는 Apache 프로그램을 사용하였음

✔️ Apache 구동 방식

  • Apache는 꾸준히 성능을 개선하고 있으며 두 가지 기본적인 방식을 지원함
    • Prefork MPM(Multi Processing Module) 방식

      • HTTP 요청이 올 때마다, 프로세스를 복제하여, 각각 별도 프로세스에서 해당 HTTP 요청 처리
    • Worker MPM(Multi Processing Module) 방식

      • 하나의 HTTP 연결 후, 여러 요청을 처리하기 위해, 복제된 프로세스 내에서 여러 쓰레드를 생성하여, 여러 HTTP 요청을 처리하는 방식

✔️ Nginx 구동 방식

  • Event Driven 방식
    • 하나의 프로세스로 동작하며, HTTP 요청을 event로 비동기식으로 처리함
      • 대부분의 HTTP응답은 결국 html 파일을 제공하는 것이므로, IO 작업
      • 따라서, IO 작업으로 event를 포워딩하고, 요청 순이 아닌, 요청 작업이 끝난 순으로 처리함
    • HTTP 요청마다, 프로세스든 쓰레드든 생성이 필요없으므로, 시스템 자원 관리에 장점이 있음
    • 보통 많은 접속자가 있을 경우, 시스템 자원 관리 효율성 때문에, Nginx가 보다 일반적으로 성능이 좋을 수 있음
      • HTML 파일 사이즈, 어떤 추가 기능을 쓰느냐 등에 따라 무조건 성능이 좋다라고 이야기할 수 없음

01.18 화

자바 100제와 알고리즘 문제 풀이를 진행했다.

✏️ 1차원 배열

다음 코드가 에러나는 이유는?

int[] sales_table;
sales_table = {1,2,3,4,5};

✔️ 정답

int[] sales_table;
sales_table = new int[] {1,2,3,4,5};

1차원 배열을 생성하고 for문으로 출력해보시오

✔️ 1차원 배열 생성 및 출력

String[] province = new String[3];

String 타입의 참조 변수 3개를 저장하기 위한 공간을 생성하였음. 이때 참조형 변수 각 요소는 기본 값 null로 초기화. int, double 같은 기본 타입 경우는 각각 0, 0.0으로 초기화

// String 배열 초기화
String[] nation = {"한국", "미국", "중국"};
System.out.println(nation[1]); //미국


//반복문을 사용하여 배열 값 모두 출력
for(int i=0; i<nation.length; i++)
	System.out.print(nation[i] + " ");
System.out.println();


//향상된 반복문 사용
for(String s : nation)
	System.out.print(s + " ");
System.out.println();


✏️ Arrays.toString() 메서드

사용을 위해서는 기본적으로 java.util.Arrays 임포트 선언이 되어져 있어야하며, toString()인자로는 배열명을 넣어주면 된다.

배열의 값들을 for문과 같은 반복문을 사용하지 않고 한꺼번에 출력하는 코드를 작성하시오

import java.util.Arrays;

public class Java100_array {
	public static void main(String[] args) {

		int[] ar = {1,2,3,4,5,6};

		System.out.println(Arrays.toString(ar));

	}
}

✏️ 배열 복사 메서드

배열을 복사하는 메서드를 말해보고 관련된 예제 코드를 구현해보시오

System.arraycopy는 byte[] 형태의 데이터를 다른 메서드에 연접하거나 복사하기 위한 메서드입니다. 파라미터는 총 5개 요소가 들어갑니다.

✔️ System.arraycopy(src, srcPos, dest, destPos, length)

  • Object src : 복사하고자 하는 소스
  • int srcPos : 원본 소스에서 어느 부분부터 읽어올지에 대한 위치
  • Object dest : 복사하려는 대상
  • int destPos : 복사본에서 자료를 받을 때 어느 부분부터 쓸 것인지에 대한 시작 위치
  • int length: 원본에서 복사본으로 데이터를 쓸 데이터 길이

그냥 쉽게 정리하면 아래와 같으며 덮어씌우는 형태로 복사가 된다.

System.arraycopy(원본배열명, 원본 배열의 복사시작점, 복사배열명, 복사될 배열 중 어디서부터 복사할껀지, 길이);
import java.util.Arrays;

public class Java100_array {
	public static void main(String[] args) {

		int[] ar = {1,2,3,4,5};
		int[] ar2 = {1,2,3,4,5,6,7,8,9,10};

		System.arraycopy(ar, 2, ar2, 4, 3); 
		System.out.println(Arrays.toString(ar2)); //[1,2,3,4,3,4,5,8,9,10]
	}
}

01.19 수

자바 100제와 프로젝트로 푸시알림 구현을 진행했다. 자바만 정리해보도록 하겠다.

✏️ 2차원 배열

2차원 배열을 만들고 출력해보시오.

//아시아 -> 동북아시아 / 동남아시아 

String[][] asia_nations = {
	{"한국", "중국", "일본"},
	{"태국", "베트남", "필리핀"},
};

System.out.println(asia_nations[0]); //동북아시아 국가를 저장하고 있는 1차원 배열의 주소를 참조하는 값이 출력
System.out.println(asia_nations[0][1]); //중국 출력

System.out.println(asia_nations.length); //2
System.out.println(asia_nations[0].length); //3

✏️ charAt() 메서드 사용해서 출력

2차원 배열을 charAt()메서드로 출력해보시오
+반복문

charAt() : 해당 인덱스에 잇는 값을 반환 -> 단어를 char 배열에 한글자씩 저장할 수 있음

String[] strAr = {"hong", "kim", "park"};
System.out.println(strAr[0]); //hong 출력
System.out.println(strAr[0].charAt(2)); // n 출력

// 반복문에서 charAt() 메서드 사용
for(int i = 0; i < strAr.length; i++)
	for(int j = 0; j < srtAr[i].length(); j++)
		System.out.print(strAr[i].charAt(j) + "\t");
	System.out.println();

✏️ length vs length()

length: 배열의 길이를 구해주는 것
length(): 문자열의 길이를 구해주는 것

int[] aaa = new int[10];
System.out.println(aaa.length); // 10 출력

String bbb = "Welcome to Seoul";
System.out.println(bbb.length()); // 16 출력

✏️ 사용자 입력으로 2차원 배열 생성

  • 사용자 입력을 받아 2차원 배열을 생성하고 값을 입력하는 코드를 구현하시오
    +중첩 반복문을 사용해서 출력도 같이 해보시오
import java.util.Scanner;

public class Java100_array_UserInput {
	public static void main(String[] args) {

		//사용자 입력을 위한 객체 선언
		Scanner sc = new Scanner(System.in);

		//2차원 배열의 행과 열 선언 -> 사용자 입력으로 처리
		System.out.print("행의 갯수를 입력하고 Enter = ");
		int R = sc.nextInt();
		System.out.print("열의 갯수를 입력하고 Enter = ");
		int C = sc.nextInt();

		//char 2차원 배열 선언
		char[][] gameMap = new char[R][C];

		//사용자 입력을 받아서 저장할 String 배열 선언
		String[] strAr = new String[R];

		// 사용자가 입력하는 값으로 2차원 배열 셋팅
		for(int i = 0; i < R; i++) {
			System.out.print((i+1)+"번째 행에 입력할 문자"+C+"개를 차례대로 입력하고 enter = ");
			strAr[i] = sc.next();
			for(int j = 0; j < C; j++) {
				gameMap[i][j] = strAr[i].charAt(j);
			}
		}

		// 2차원 배열에 있는 값 출력
		System.out.println(strAr[0]); // ex) KOR
		System.out.println(strAr); // 주소값


		for(int i = 0; i < R; i++) {
			for(int j = 0; j < C; j++) 
				System.out.print(gameMap[i][j]);
			System.out.println();
		}
	}
}

01.20 목

스프링으로 Fcm 푸시 알림을 구현했고, 자바 100제에서 메서드에 대해 공부했다.

✏️ 메서드

메서드의 정의와 기본적인 자바의 메서드를 작성해보시오

(1) 메서드란 무엇인가?
: 메서드는 다른 언어에서의 함수와 마찬가지로 어떤 특정한 동작이나 처리를 하도록 만들어진 코드 단위이다.
: 반복적인 작업을 처리해야 하는 경우 메서드로 만들어놓으면 이후에 필요할 때 다시 재사용할 수 있어서 아주 유용하다.

(2) 메서드 종류 -> 크게 4가지 유형
: 반환값 X / 받는 인자값 X
: 반환값 X / 받는 인자값 O
: 반환값 O / 받는 인자값 X
: 반환값 O / 받는 인자값 O

public class Java100_method_Exam01 {

	public static void showMenu() {
		System.out.println("showMenu() 메서드가 호출되었습니다.");
	}

	public static void main(String[] args) {

		// 반환값 X, 인자값 X
		showMenu();

	}
}

메인 메서드가 static이라 showMenu()같은 메서드도 static이어야함.

반환값이 없고 받는 인자값이 2개 있는 덧셈 메서드를 구현하시오

public class Java100_method_Exam02 {

	public static void plusMethod(int a, int b) {
		System.out.printf("인자로 넘겨받은 2개의 값은 %d와 %d입니다.", a, b);

		int rst = a + b;
		System.out.println("두 수를 더한 값은 = " + rst);
	}

	public static void main(String[] args) {

		// 반환값 X, 인자값 O
		int a = 100, b = 200;
		plusMethod(a, b);

	}
}

반환값이 있고 받는 인자값이 없는 메서드를 구현해보시오

public class Java100_method_Exam03 {

	public static int returnMethod() {
		int ret = 100;
		ret *= 100;

		return ret; // 10000
	}

	public static void main(String[] args) {

		// 반환값 O, 인자값 X
		int rst;
		rst = returnMethod();

		System.out.println("메서드 호출에 따른 리턴된 값은 = " + rst); // 10000

	}
}

반환값이 있고 받는 인자값이 있는 대문자 출력 메서드를 구현해보시오

public class Java100_method_Exam04 {

	public static String capitalMethod(String str) {

		String ret = str.toUpperCase();

		return ret;

	}

	public static void main(String[] args) {

		// 반환값 O, 인자값 O
		String rst;

		rst = capitalMethod("korea");
		System.out.println(rst); // KOREA

	}
}

문자가 아니라 문자열은 "" 쌍따옴표 사용 주의

✏️ static

static 선언이 안되어있는 메서드를 사용하는 방법에 대해서 코드로 구현해보시오

public class Java100_method_ExamStatic2 {

	public void helloWorld() {
		System.out.println("Hello, world~");
	}

	public static void main(String[] args) {

		//helloWorld(); // -> 메인 메서드는 static 메서드만 호출할 수 있기 때문에 static을 빼면 에러가남

		//객체 생성 후 메서드 호출
		Java100_method_ExamStatic2 jes = new Java100_method_ExamStatic2();

		jes.helloWorld();

	}
}

01.21 금

자바 100제를 풀었다

✏️ Call by value vs Call by reference

메서드로 인자 전달시 정수 100을 보냈을 때의 아래 코드의 결과를 말해보시오

(1) Call by value

public class Java100_method_MethodCall1 {

	// Call by value -> 값에 의한 호출
	// 메서드로 인자값을 넘길 때 해당 값을 복사하여 넘기는 방식
	// 따라서 sum() 메서드 내부에서는 복사된 값으로 처리를 한다.
	public static void sum(int a) {
		a = a + 400;
		System.out.println(a); // 500
	}

	public static void main(String[] args) {

		int a = 100;
		sum(a);

		System.out.println(a); // 100
	}
}

(2) Call by reference

class TestNumber {
	int num;
	TestNumber(int num) {this.num = num;}
}


public class Java100_method_MethodCall2 {

	public static void sum(TestNumber a) {
		
		System.out.println(a); // 주소값이 찍힘
		System.out.println(a.num); // 100

		a.num += 400;
		System.out.println(a.num); // 500

	}

	public static void main(String[] args) {

		TestNumber a = new TestNumber(100);
		sum(a); //주소값 전달

		System.out.println(a.num); // 500
	}
}

✏️ Wapper Class란?

자바의 자료형은 크게 기본 타입과, 참조 타입으로 나눠집니다. 기본 타입은 대표적으로 char,int,double 등이 있고 참조는 배열,class 등이 있습니다. 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야하는 경우가 종종 있습니다. 이럴 때 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다.

래퍼 클래스 종류

기본 타입래퍼 클래스
byteByte
charCharacter
intInteger
floatFloat
doubleDouble
booleanBoolean
longLong
shortShort

구조도

자동 박싱과 자동 언박싱

기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고 반대로 포장 객체에서 기본타입의 값을 얻어내는 과정을 언박싱이라고 합니다.

자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생합니다. 예를들어 int 타입의 값을 Integer클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer 객체가 생성됩니다.

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = 17; // 자동 박싱
        int n = num; //자동 언박싱
        System.out.println(n);
    }
}

✏️ 메서드, 리턴값

2개의 정수형 값을 리턴하는 메서드를 구현하시오

import java.util.Arrays;

public class Java100_method_TwoReturn1 {
	
	public static int[] testMethod() {
		int num1 = 100;
		int num2 = 200;
		return new int[] {num1, num2};
	}

	public static void main(String[] args) {

		int[] result = testMethod();

		System.out.println(result); // 주소값 출력
		System.out.println(result[0] + "," + result[1]); // 각각 출력
		System.out.println(Arrays.toString(result));
	}
}

반환값이 2개 있는 메서드를 구현해보시오
+메서드는 소문자는 대문자로 대문자는 소문자로 출력되도록 구현한다.


import java.util.Arrays;

public class Java100_method_TwoReturn2 {
	
	public static String[] capitalMethod(String a, String b) {
		String a_ = a.toUpperCase();
		String b_ = b.toLowerCase();

		String[] ret = {a_,b_};
		return ret
	}

	public static void main(String[] args) {

		String[] result = capitalMethod("korea", "USA");

		System.out.println(result); // 주소 출력
		System.out.println(result[0] + ", " + result[1]); // KOREA, usa
		System.out.println(Arrays.toString(result)); // [KOREA, usa]
	}
}

✏️ OOP - 클래스

클래스란 무엇이고 어떤 역할을 하는지에 대해서 설명해보시오.

(1) 클래스란 무엇인가?

클래스란 객체(또는 인스턴스)를 생성하는 하나의 틀(프레임,템플릿)이다.
클래스는 만들고자 하는 객체의 "특징"과 "동작"에 많은 시간을 들이고 집중하면서 설계를 하게 된다.

객체의 특징 -> 속성(attribute)
객체의 동작 -> 메서드(method): 함수의 의미

FarmMachine의 속성과 동작들을 가지는 클래스를 코드로 구현하고 객체를 생성하여 동작시켜보시오

class FarmMachine {
	
	// 속성(특징)
	int price; // 가격
	int year; // 연식
	String color; // 색상


	// 동작/기능/행동
	void move() {
		System.out.println("Farm-machine is moving");
	}

	void dig() {
		System.out.println("Farm-machine is digging");
	}

	void grind() {
		System.out.println("Farm-machine is grinding");
	}
}

public class Java100_oop_Exam02 {
	public static void main(String[] args) {

	// 객체 생성
	FarmMachine fm = new FarmMachine();
	System.out.println(fm); // 주소값 출력

	// 생성된 객체에 속성 값 입력하기
	fm.price = 1000000;
	fm.year = 2022;
	fm.color = "red";

	// 속성 값 출력하기
	System.out.println(String.format("%,d", fm.price)); // 1,000,000
	System.out.println(fm.year);
	System.out.println(fm.color);

	// 동작 수행하기
	fm.move();
	fm.dig();
	fm.grind();

	}
}

문자열을 숫자로 변환시키고 진수를 지정해서 출력해보시오

public class Java100_oop_ParseInt {
	public static void main(String[] args) {

		// 문자열끼리의 연산
		String a1 = "1";
		String b1 = "2"
		String c1 = a1 + b1;
		System.out.println("a1 + b1 = " + c1); // 12
		System.out.println(c1.getClass().getName()); // java.lang.String

		// 문자열 -> 숫자로 변환 후 연산
		int a2 = Integer.parseInt(a1);
		int b2 = Integer.parseInt(b1);
		System.out.println(a2 + b2); // 3

		// 진수 지정
		System.out.println(Integer.parseInt("2022"); // 2022, default = 10진수
		System.out.println(Integer.parseInt("1001", 2); // 9
		System.out.println(Integer.parseInt("1004", 8)); // 516
		System.out.println(Integer.parseInt("A", 16)); // 10
	}
}

- 왜 변환이 필요한가?
: 1 + 2 숫자끼리의 연산은 3이지만, 문자열끼리의 연산은 12가 되기 때문에 숫자로 변환 후 연산을 수행해야 한다.
: 문자열을 숫자로 변환시키는 방법 -> Integer.parseInt() 사용
: parseInt() -> Integer 클래스의 static으로 지정 -> 따라서, 객체의 생성없이 바로 "클래스명.parseInt()"로 직접 사용이 가능
: 두번째 인자값으로 진수를 지정할 수 있음 -> Integer.parseInt("1000", 2);

✏️ 클래스 특징, 생성자

클래스 작성시 주의할 사항들 중 틀린 것을 말해보시오

(1) 하나의 파일에 2개 이상의 클래스를 작성할 수 있다
(2) 3개의 클래스가 있다면 자바 파일명이 될 수 있는 것은 public 키워드가 붙은 클래스이다
(3) 하나의 파일에 있는 3개의 클래스에 모두 public 키워드를 붙일 수 있다 X -> 하나만 가능
(4) 한 파일 내 3개 이상의 클래스에 모두 public 키워드를 안 붙일 수 있다
(5) 한 파일 내 3개 이상의 클래스에 모두 public 키워드가 없다면 클래스 중 어느 것이라도 파일명이 될 수 있다
(6) 자바 파일에 클래스가 한개 있다면 클래스명이 곧 파일명이 되어야 한다

클래스에서 생성자란 무엇이고 어떤 특징을 갖고 있는지 말해보시오

(1) 생성자(Constructor)
: 생성자는 new 키워드로 클래스의 객체(또는 인스턴스)가 생성될 때 제일 먼저 자동으로 호출되는 메서드이다.
: 따라서, 객체의 초깃값을 설정하는 등의 용도로 많이 사용된다
: 생성자명은 클래스명과 동일하게 만든다
: 생성자는 리턴되는 반환값이 없다 -> 객체가 생성될 때 제일 먼저 호출만 된다.
: 생성자는 오버로딩이 가능하다.
: 생성자는 default 생성자란게 있다 -> 클래스내에 생성자가 없다면 default 생성자가 자동 호출 -> 클래스명과 동일하고 받는 인자값 X

(2) 생성자 위치
: 보통 속성과 메서드 사이에 기술한다.
: 생성자도 메서드이므로 메서드 그룹에 속하는데 제일 상단에 보통 위치한다.

객체 생성시 초깃값을 생성자 메서드에서 설정하는 클래스를 구현해보시오

class Person {
	
	int age;
	String name;

	Person() {}
	Person(int age, String name) {
		this.age = age;
		this.name = name;
	}

	void printPerson() {
		System.out.println("나이: " + age + ", 이름: " + name);
	}

}

public class Java100_oop_Exam06 {
	public static void main(String[] args) {

		Person p1 = new Person(20, "홍길동");
		//System.out.println(p1); //주소값 출력
		//System.out.println(p1.age); //20
		//System.out.println(p1.name); //홍길동

		p1.printPerson();
	}
}

01.22 토

자바 100제와 테스트 커버리지에 대한 공부 진행

✏️ 상속

클래스에서 상속이란 무엇인지 상속의 정의와 특징을 말해보시오

상속이란?

:부모 클래스가 가지고 있는 속성(변수)들과 동작/기능(메서드)들을 그대로 물려받아 새로운 클래스를 만드는 것
: 물려받게 되는 원본 클래스를 부모 클래스(Parent class) 또는 슈퍼클래스 (Super class)라고 부른다.
: 상속받아 새롭게 만들어진 클래스는 말 그대로 자식 클래스(Child class) 또는 서브/하위 클래스(Sub class)라고 부른다.
: 또 다른 표현으로는 기초/기반 클래스(Base class), 파생 클래스(Derived class)라고도 부른다.

상속의 장점

: 가장 큰 장점은 재활용성 !
: 완전히 새로운 것을 만드는 것이 아니라 기존 부모로 부터 상속을 받아 필요한 것만 추가로 더해서 만드는 것.
: 부모 클래스에 정의되어져 있는 멤버 필드(변수)나 메서드들을 그대로 상속받아 사용하면 된다.
: 상속받은 메서드라 해도 필요에 다라서 자식 클래스에서 용도를 변경해서 사용하는 것도 가능.

상속의 사용

: 기존 부모 클래스를 확장한다는 개념 -> extends 키워드 사용
: 부모 클래스의 멤버 필드, 메서드는 상속이 가능하나 생성자는 상속이 안된다.
: 부모 클래스의 접근 제한자 private인 경우에는 아무리 자식 클래스가 상속을 받았다 하더라도 접근 불가능.

클래스의 상속을 코드로 구현해보시오
+클래스 상속에서 메서드 오버라이딩에 대해서 설명하고 구현해보시오

class Person {
	
	int gender;
	int power;

	Person() {
		this.gender = 1; // 1:남성, 2:여성
		this.power = 100; // 기본 파워
	}

	void walk() {
		System.out.println("걸어가고 있어요~");
	}
}

class Hero extends Person {
	
	String name;
	int age;

	Hero() {}
	Hero(String name, int age) { //오버로딩
		this.name = name;
		this.age = age;
	}

	void walk() { //오버라이딩
		System.out.println("2배로 빨리 걸어가고 있어요~");
	}

	void eat() {
		System.out.println("밥먹고 있어요");
	}

	void displayPerson() {
		System.out.println("이름: " + name + ",나이: " + age + ",성별: " + gender + ",파워: " + power);
	}

}

class Villain {}

public class Java100_oop_InheritanceSample2 {
	public static void main(String[] args) {

		// [1]객체 생성
		Person p1 = new Person();
		// p1.eat() // -> Err
		p1.walk(); // 걸어가고 있어요~

		// [2]상속을 통한 슈퍼맨 객체 생성
		Hero h1 = new Hero("슈퍼맨", 20);
		System.out.println(h1.name);
		System.out.println(h1.age);
		System.out.println(h1.gender); //부모 클래스 필드
		System.out.println(h1.power); //부모 클래스 필드

		h1.walk(); // 2배로 빨리 걸어가고 있어요~ (메서드 오버라이딩)
		h1.eat();
		h1.displayPerson();

		// [3]원더우먼 객체 생성
		Hero h2 = new Hero("원더우먼", 30);
		h2.displayPerson(); //원더우먼, 30, 1, 100
		h2.gender = 2;
		h2.power = 300;
		h2.displayPerson(); //원더우먼, 30, 2, 300
	} 
}

✏️ getter, setter

getter, setter가 포함된 클래스의 상속을 코드로 구현해보시오

class Person {
	
	private String name; //외부에서 변경 불가능
	private int age;
	private int height;
	private int weight;

	Person() {}
	Person(String name, int age, int height, int weight) {
		this.name = name;
		this.age = age;
		this.height = height;
		this.weight = weight;
	}

	// Method
	public String getName(){ return name; }
	public void setName(String name) { this.name = name; }

	public int getAge() { return age; }
	public void setAge(int age) { this.age = age; } 

	public int getHeight() { return height; }
	public void setHeight(int height) { this.height = height; }

	public int getWeight() { return weight; }
	public void setWeight(int weight) { this.weight = weight; }

	public void move() {
		System.out.println("이동 중..");
	}

}

class Villain extends Person {
	
	private String unique_key;
	private int weapon; // 1~9 숫자로 무기 분류
	private double power;

	Villain(String name, int age, int height, int weight, String unique_key, int weapon, double power) {
		super(name, age, height, weight);
		this.unique_key = unique_key;
		this.weapon = weapon;
		this.power = power;
	}

	public String getUnique_key() { return unique_key; }
	public void setUnique_key(String unique_key) { this.unique_key = unique_key; }

	public int getWeapon() { return weapon; }
	public setWeapon(int weapon) { this.weapon = weapon; }

	public double getPower() { return power; }
	public setPower { this.power = power; }

	public void printPerson() {
		System.out.println("악당 이름: " + getName());
		System.out.println("악당 무기: " + getWeaponName(getWeapon()));
		System.out.println("악당 넘버: " + getUnique_key());
	}

	public String getWeaponName(int a) {

		String weapon;
		switch(a) {
			case 1:
				weapon = "창";
				break;
			case 2:
				weapon = "방패";
				break;
			case 3:
				weapon = "총";
				break;
			default:
				weapon = "---";
				break;
		}
		return weapon;
	}
}

class Hero extends Person {}

public class Java100_oop_InheritanceSample5 {
	public static void main(String[] args) {

		Person p1 = new Person();
		// p1.name = "홍길동"; // Err
		p1.setName("홍길동");
		System.out.println(p1.getName()); //홍길동 

		Villain v1 = new Villain("좀비", 20, 180, 80, "15001231", 1, 99.5);
		v1.printPerson();
		v1.move(); // 부모 클래스의 move() 메서드를 호출

	}
}

✏️ 객체 배열

객체에 대한 참조값을 요소로 가지는 객체 배열 코드를 구현하시오.
+반복문을 사용하여 객체 배열을 생성하고 출력

class Person {
	private String name;
	private int age;

	Person() {}
	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() { return name; }
	public void setName(String name) { this.name = name; }

	public int getAge() { return age; }
	public void setAge(int age) { this.age = age; }
}

public class Java100_oop_ObjArray {
	public static void main(String[] args) {

		// [1]객체 생성
		Person[] pa = new Person[3];
		pa[0] = new Person("홍길동", 20); //생성된 객체의 주소값 저장
		pa[1] = new Person("김길동", 21);
		pa[2] = new Person("박길동", 22);

		// 출력
		for (int i=0; i<pa.length; i++) {
			System.out.print(pa[i] + "\t\t"); //주소값 출력
		}
		System.out.println();

		for (int i=0; i<pa.length; i++) {
			//System.out.print(pa[i].name + "\t\t"); //Err -> private
			System.out.print(pa[i].getName() + "\t\t"); //이름 출력
		}
		System.out.println();


		// [2] 반복문으로 객체 배열 생성, 출력
		Person[] pa2;
		pa2 = new Person[5]; 

		for(int i=0; i<pa2.length; i++) {
			pa2[i] = new Person(i+"번 홍길동", i+20); // i 만 이름으로 입력받으면 정수형이라 안되므로 문자열을 붙어서 문자열로 전달

			System.out.println(pa2[i].getName() + " -> 나이: " + pa2[i].getAge());
		}


	}
}
profile
백엔드 개발자

0개의 댓글