230324 풀스택 17일차 - 생성자, 인터페이스

황인성·2023년 3월 24일
0

홍길동 홍길순 활 칼 창 문제 (생성자를 이용해서 생성자 안에서 홍길동, 홍길순 이름을 할당해 줄 수 있었고 칼 객체도 홍길순 생성자 안에서 할당해줘서 홍길순이 칼을 사용할 수 있게 했다.)

class Main {
	public static void main(String[] args) {
		전사 a전사 = new 홍길동();
		a전사.a무기 = new();
		a전사.공격();
		// 홍길동이(가) 활(으)로 공격합니다.
		a전사 = new 홍길순();
		a전사.공격();
		// 홍길순이(가) 칼(으)로 공격합니다.
		a전사.a무기 = new();
		a전사.공격();
		// 홍길순이(가) 창(으)로 공격합니다.
	}
}
class 전사 {
	무기 a무기;
	String 전사이름;
	void 공격 () {
		this.a무기.작동(전사이름);
	}
}
class 홍길동 extends 전사{
	홍길동 () {
		this.전사이름 = "홍길동";
	}
}
class 홍길순 extends 전사{
	홍길순 () {
		a무기 = new(); // main 클래스에서 할당되지 않은 a무기에 칼 객체 할당해줌
		this.전사이름 = "홍길순";
	}
}
class 무기 {
	void 작동(String 이름) {
	}
}
classextends 무기{
	void 작동(String 이름) {
		System.out.println(이름 + "(이)가 활로 공격합니다.");
	}
}
classextends 무기{
	void 작동(String 이름) {
		System.out.println(이름 + "(이)가 칼로 공격합니다.");
	}
}
classextends 무기{
	void 작동(String 이름) {
		System.out.println(이름 + "(이)가 창로 공격합니다.");
	}
}
class Main {
	public static void main(String[] args) {
		new 사람();
		// 출력 : 사람이 태어났습니다.
		
		new 사람(10);
		// 출력 : 태어나서부터 10살인 사람이 태어났습니다.
		
		new 사람(20);
		// 출력 : 태어나서부터 20살인 사람이 태어났습니다.
		
	}
}
class 사람 {
	int 나이;
	사람 () {
		System.out.println("사람이 태어났습니다.");
	}
	사람 (int 나이) {
		this.나이 = 나이;
		System.out.println("태어나서부터 " + this.나이 + "살인 사람이 태어났습니다.");
	}
}
class Main {
	public static void main(String[] args) {
		계산기 a계산기 = new 계산기();
		
		System.out.println(a계산기.더하기(10, 20));
		// 출력 : 30
		
		System.out.println(a계산기.더하기(10, 20, 30));
		// 출력 : 60
		
		System.out.println(a계산기.더하기(10.5, 20, 30));
		// 출력 : 60.5
	}
}
class 계산기 {
	int 더하기 (int num1, int num2) {
		return num1 + num2;
	}
	int 더하기 (int num1, int num2, int num3) {
		return num1 + num2 + num3;
	}
	double 더하기 (double num1, int num2, int num3) {
		return num1 + num2 + num3;
	}
}
class Main {
	public static void main(String[] args) {
		new 사과();
		new 포도();
		new 사람("홍길동");
		new 사람();
	}
}
class 사과 {
	// 생성자를 만들지 않은 클래스는 자바에서 자동으로 생성자를 하나 만들어준다.
	// 참고로 자동으로 만들어 질 때 '매개변수가 없는 생성자'가 만들어진다.
	// 하지만 생성자를 직접 만들면 자바는 더 이상 자동으로 생성자를 만들어주지 않는다.
}
class 포도 {
}
class 사람 {
	String 사람;
	사람 () {
	}
	사람 (String 사람) {
	}
}
//code.oa.gg/java8/936
// 문제 : 아래가 실행되도록 해주세요.
class Main {
	public static void main(String[] args) {
		System.out.println("== 사람객체 생성시작 ==");
		new 사람();
		System.out.println("== 사람객체 생성끝 ==");
		System.out.println("== 청둥오리객체 생성시작 ==");
		new 청둥오리();
		System.out.println("== 청둥오리객체 생성끝 ==");
		/* 출력
== 청둥오리객체 생성시작 ==
생물이 생성되었습니다.
동물이 생성되었습니다.
오리가 생성되었습니다.
청둥오리 생성되었습니다.
== 청둥오리객체 생성끝 ==
*/
	}
}
class 생물 {
	생물() {
		// 이 함수는 부모 클래스 생성자를 자동으로 호출합니다.
		System.out.println("생물이 생성되었습니다.");
	}
}
class 동물 extends 생물 {
	동물() {
		// super(); // 부모 클래스의 생성자를 호출합니다. 생략가능합니다.
		// 이 함수는 부모 클래스 생성자를 자동으로 호출합니다.
		System.out.println("동물이 생성되었습니다.");
	}
}
class 사람 extends 동물 {
	사람() {
		super(); // 부모 클래스의 생성자를 호출합니다.
		// 이 함수는 부모 클래스 생성자를 자동으로 호출합니다.
		System.out.println("사람이 생성되었습니다.");
	}
}
class 오리 extends 동물{
	오리 () {
		super();
		System.out.println("오리가 생성되었습니다.");
	}
}
class 청둥오리 extends 오리{
	청둥오리 () {
		System.out.println("청둥오리가 생성되었습니다.");
	}
}
// 문제 : 아래 질문에 답해주세요.

// 1 : 사람 클래스 안에 있는 생성자의 개수는? 1개(사실 알 수 없다. **13번 주석 내용 참조.)
// 2 : 사람 클래스의 부모 클래스는? object.(항상 최상위 클래스)
// 3 : 사람 클래스의 부모 클래스에 생성자가 1개 있다고 가정할 때 사람 클래스 안에 있는 생성자의 총 개수는? 2개(object, 사람)

class Main {
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
}

class 사람 { // 모든 클래스는 extends object 를 상속받는 상태인데 이 object의 갯수가 몇 개인지 모르기 때문에 1번 문제의 답은 알수없다가 답이다.
  
}
// 부모로 부터 받은 생성자 함수는 자동으로 자식 클래스에 호출되고 있다.

interface 기본구조

class Main {
	public static void main(String[] args) {
		사람 a사람 = new 홍길동();
		
		변호사 a변호사 = (변호사)a사람;
	}
}
class 사람 {
	
}
class 홍길동 extends 사람 implements 변호사{
	
}
interface 변호사 {
	
}

interface 다중상속

//code.oa.gg/java8/896
// 문제 : 아래가 실행되도록 해주세요.
class Main {
	public static void main(String[] args) {
		사람 a사람 = new 홍길동();
		변호사 a변호사 = (변호사)a사람;
		치과의사 a치과의사 = (치과의사)a사람;
		성화봉송자 a성화봉송자 = (성화봉송자)a사람;
	}
}
class 사람 {
}
class 홍길동 extends 사람 implements 변호사, 치과의사, 성화봉송자{ // interface는 다중상속이 가능하다.
}
interface 변호사 {
}
interface 치과의사 {
}
interface 성화봉송자 {
}

-접근제한자-
getter, setter
public : 공공의
private : 사적인
default : 기본값

//code.oa.gg/java8/1069
// 문제 : 오류를 수정하세요.

class Main {
	public static void main(String[] args) {
		사람 a사람 = new 사람();
		a사람.id = 20;
		
		System.out.println("제 번호는 " + a사람.id + " 입니다.");
		// 출력 : 제 번호는 20 입니다.
	}
}

class 사람 {
	// private => 외부로 공개되지 않는다., 리모콘에 노출되지 않는다.
	// 이 클래스 안에서만 접근할 수 있고 외부에서 접근하면 error남
	private int id;
}

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓수정↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//code.oa.gg/java8/1069
// 문제 : 오류를 수정하세요.

class Main {
	public static void main(String[] args) {
		사람 a사람 = new 사람();
		a사람.setId(20);
		
		System.out.println("제 번호는 " + a사람.getId() + " 입니다.");
		// 출력 : 제 번호는 20 입니다.
	}
}

class 사람 {
	// private => 외부로 공개되지 않는다., 리모콘에 노출되지 않는다.
	// 이 클래스 안에서만 접근할 수 있고 외부에서 접근하면 error남
	private int id;
	
	void setId (int id) {
		this.id = id;
	}
	int getId () {
		return this.id;
	}
}
//code.oa.gg/java8/1071
// 문제 : 사람의 id를 출력해주세요.
// 조건 : 사람의 id를 20으로 설정해주세요.
// 조건 : 사람 클래스의 id 필드의 private 속성은 수정할 수 없습니다.
class Main {
	public static void main(String[] args) {
		사람 a사람 = new 사람();
		
		// 구현시작
		// 
		a사람.setId(20);
		System.out.println("제 번호는 " + a사람.getId() + " 입니다.");
		// 구현끝
		// 출력 : 제 번호는 20 입니다.
	}
}
class 사람 {
	private int id;
	
	// 힌트 : 여기에 메소드 2개 추가해야 합니다.
	void setId (int id) {
		this.id = id;
	}
	int getId () {
		return this.id;
	}
	
}

예외처리 (try, catch) 기본구조

class Main {
	public static void main(String[] args) {
		int rs = 계산기.나누다(10, 0);
		System.out.println(rs);
	}
}
class 계산기 {
	static int 나누다(int a, int b) {
		int rs = 0;
		/* 예외처리 기본형식
		try {
		// ...
		}
		catch (타입 e ) {
		// ...
		}
		*/
		try {
			rs = a / b;
		}
		catch (ArithmeticException e ) {
			rs = 0;
		}
		
		return rs;
	}
}
class Main {
    public static void main(String[] args) {
        int[] datas = new int[2];
        
        try {
            work(datas);
        }
        catch ( ArrayIndexOutOfBoundsException e ) { // main 함수 입장에서 이 코드는 가독성이 떨어진다.
            System.out.println("이런.. 오류가 발생했군요.");
        }
    }
    
    static void work(int[] datas) {
        datas[0] = 10;
        datas[1] = 20;
        datas[2] = 30; // 여기서 자동으로 throw new ArrayIndexOutOfBoundsException(); 이 발생한다.
    }
}

사건이 터질것을 예측해서 미리 보고(예외직접발생, throw new)

class Main {
    public static void main(String[] args) {
        int[] datas = new int[2];
        
        try {
            work(datas);
        }
        catch ( IllegalArgumentException e ) { // v1 의 코드보다 원인이 좀 더 명확해진다. 즉 v1 보다 더 가독성 높은 코드이다.
            System.out.println("이런.. 오류가 발생했군요.");
        }
    }
    
    static void work(int[] datas) {
        if ( datas.length < 3 ) {
            throw new IllegalArgumentException(); // 함수가 여기서 멈춤
        }
        
        datas[0] = 10;
        datas[1] = 20;
        datas[2] = 30;
    }
}

명확한 사건보고를 위해 직접 예외 클래스를 생성하여 보고(예외직접발생, throw new)

class Main {
    public static void main(String[] args) {
        int[] datas = new int[2];
        
        try {
            work(datas);
        }
        catch ( 입력된_배열의_사이즈가_3보다_작은_Exception e ) { // 코드 가독성이 v2 보다 좋음, 단 예외클래스를 만들어야 해서 귀찮음, 그래서 실무에서는 예외클래스를 꼭 필요할 때만 직접 만듬
            System.out.println("이런.. 오류가 발생했군요.");
        }
    }
    
    static void work(int[] datas) {
        if ( datas.length < 3 ) {
            throw new 입력된_배열의_사이즈가_3보다_작은_Exception(); // 함수가 여기서 멈춤
        }
        
        datas[0] = 10;
        datas[1] = 20;
        datas[2] = 30;
    }
}

class 입력된_배열의_사이즈가_3보다_작은_Exception extends RuntimeException { }

예외처리의 방식을 통해서 프로그램 실행 중 오류가 났을 때, 그냥 냅다 블루스크린 떠서 다운되는것 보다는 알림창으로 오류의 내용을 알려주고 미리 정리해서 프로그램을 좀 더 안정적으로 보일 수 있게 함.

스캐너 기본구조

import java.util.Scanner;

class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.printf("숫자 : ");
		
		int input = scan.nextInt(); // 대기, 숫자 하나 입력될 때 까지.
		
		System.out.printf("입력된 숫자 : %d\n", input);
		
		scan.close();
		
	}
}
profile
문제 해결을 위해 끊임없이 파고드는 걸 좋아합니다.

0개의 댓글