홍길동 홍길순 활 칼 창 문제 (생성자를 이용해서 생성자 안에서 홍길동, 홍길순 이름을 할당해 줄 수 있었고 칼 객체도 홍길순 생성자 안에서 할당해줘서 홍길순이 칼을 사용할 수 있게 했다.)
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 이름) {
}
}
class 활 extends 무기{
void 작동(String 이름) {
System.out.println(이름 + "(이)가 활로 공격합니다.");
}
}
class 칼 extends 무기{
void 작동(String 이름) {
System.out.println(이름 + "(이)가 칼로 공격합니다.");
}
}
class 창 extends 무기{
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();
}
}