
interface
package ch07_interface;
public interface Tools {
// interface 안의 모든 멤버필드는 자동으로 public static final
int A = 1;
public static final int B = 2;
// interface는 생성자를 만들 수 없음
// 즉, 위와 같이 멤버변수를 선언과 동시에 초기화를 해야 함
// public Toosl() {} // Error
// interface 에서 만드는 메소드는 추상메소드만 가능
// abstract를 쓰지 않아도 자동으로 public abstract
public abstract void abstractMethod();
// 아래와 같이 static, default는 가능
public static void staMethod() {
System.out.println("- static method() -");
}
public default void defMethod() {
System.out.println("- default method() -");
}
}
package ch07_interface;
public class ToolsImpl implements Tools{
@Override
public void abstractMethod() {
}
}
package ch07_interface;
class TestA {}
interface InterA {}
class TestB extends TestA {}
class TestZ extends TestB {}
class TestC implements InterA {}
class TestD {}
//class TestE extends TestA, TestD{} // Error 자바는 class의 다중상속 불가
class TestE extends TestA implements InterA {}
//interface가 interface를 상속 받을 때는 extends 써야함!
interface InterB extends InterA {}
interface InterC {}
// interface는 한 번에 여러개를 구현 가능
class TestF implements InterA, InterB, InterC {}
public class InheritanceWay {
}
package ch08_interface;
public interface Power {
public void on();
public void off();
}
package ch08_interface;
public interface Volume {
public void up();
public void down();
}
package ch08_interface;
public class Player implements Power, Volume{
public void on() {
System.out.println("- 전원 ON -");
}
public void off() {
System.out.println("- 전원 OFF -");
}
public void up() {
System.out.println("- 소리를 높여요 -");
}
public void down() {
System.out.println("- 소리를 낮춰요 -");
}
}
Shape interface 를 상속받은 Rectangle(사각형), Circle(원) class 를 정의하고,
ShapeTest class 에서 Shape 변수를 사용해서 다형성을 구현한 코드를 작성하세요
package ch09_quiz;
public interface Shape {
public double area(); // 도형 넓이 계산
public void drawing(); // 도형 그리기
}
package ch09_quiz;
public class Rectangle implements Shape{
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double area() {
return this.width * this.height;
}
public void drawing() {
System.out.println("-- Shape --");
System.out.println("ㅁㅁㅁㅁㅁ");
System.out.println("ㅁ ㅁ");
System.out.println("ㅁ ㅁ");
System.out.println("ㅁ ㅁ");
System.out.println("ㅁㅁㅁㅁㅁ");
}
}
package ch09_quiz;
public class Circle implements Shape{
private double radius;
private final double PI = 3.141592;
public Circle(double radius) {
this.radius = radius;
}
public double area() {
return radius*radius*PI;
}
public void drawing() {
System.out.println("---- Shape ----");
System.out.println(" ㅁㅁㅁ ");
System.out.println(" ㅁ ㅁ ");
System.out.println("ㅁ ㅁ");
System.out.println("ㅁ 😀 ㅁ");
System.out.println("ㅁ ㅁ");
System.out.println(" ㅁ ㅁ ");
System.out.println(" ㅁㅁㅁ ");
}
}
package ch09_quiz;
import java.util.Scanner;
public class ShapeTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("1. 사각형 2. 원 선택 >> ");
int select = sc.nextInt();
Shape s = null;
switch (select) {
case 1:
System.out.println("--- 사각형 ---");
System.out.print("사각형의 가로, 세로 입력 >> ");
double w = sc.nextDouble();
double l = sc.nextDouble();
s = new Rectangle(w, l);
break;
case 2:
System.out.println("--- 원 ---");
System.out.print("원의 반지름 입력 >> ");
double r = sc.nextDouble();
s = new Circle(r);
break;
default:
System.out.println("도형 선택 오류~");
}
if (s != null) {
s.drawing();
System.out.println("넓이 " + s.area());
}
}
}


package ch10_interface;
public interface Print {
int START = 1;
int CANCEL = 2;
public void printStart();
public void printCancel();
}
package ch10_interface;
public class Printer implements Print{
public void printStart() {
System.out.println("- 프린터 출력 시작 -");
}
public void printCancel() {
System.out.println("- 프린터 출력 취소 -");
}
}
package ch10_interface;
public class Scan implements Print {
public void printStart() {
System.out.println("- 스캔 시작 -");
}
public void printCancel() {
System.out.println("- 스캔 취소 -");
}
}
package ch10_interface;
import java.util.Scanner;
public class PrintMachine {
private Print current; // 현재 사용중인 장치
private int device; // 1. 프린터 2. 스캐너
private Printer printer;
private Scan scan;
private Scanner scanner;
public PrintMachine() {
printer = new Printer();
scan = new Scan();
device = 1;
current = printer;
scanner = new Scanner(System.in);
}
// 메뉴
public boolean modeSelect() {
System.out.print("1. 장치 선택 2. 인쇄/취소 >> ");
int mode = scanner.nextInt();
switch(mode) {
case 1: // 장치 선택
selectDevice();
break;
case 2: // 인쇄, 취소
printRun();
break;
case 0:
return false;
}
System.out.println();
return true;
}
// 장치 선택 메소드
public void selectDevice() {
System.out.print("1. 프린터 2. 스캐너");
device = scanner.nextInt();
if(device ==1) current = printer;
else if(device ==2) current = scan;
}
// 인쇄, 취소 메소드
public void printRun() {
System.out.print("1. 시작 2. 취소 >> ");
int select = scanner.nextInt();
switch(select) {
case Print.START:
current.printStart();
break;
case Print.CANCEL:
current.printCancel();
}
}
}
package ch10_interface;
public class PrintMain {
public static void main(String[] args) {
PrintMachine pm = new PrintMachine();
boolean run = true;
while(run) {
run = pm.modeSelect(); // while 진행여부 선택
System.out.println();
}
System.out.println("- Power OFF -");
}
}
- Power OFF -
class OuterG {
public static int a;
private int b;
static {
a = 1;
}
public OuterG() {
b = 2;
}
public void outerGinfo() {
System.out.println("- outerGinfo() -");
System.out.println("a : " + a);
System.out.println("b : " + b);
}
// 중첩클래스 : 클래스 안에 클래스
// 자주쓰는 클래스다 > 클래스 안에 집어넣어 버림
class InnerG {
// public static int c; // Error
private int d;
public InnerG() {
d = 4;
}
public void innerGinfo() {
System.out.println("- innerGinfo() -");
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println("d : " + d);
}
}
}
public class Ex01General {
public static void main(String[] args) {
OuterG outer = new OuterG();
outer.outerGinfo();
System.out.println();
// 바로 못 만듬
// inner class를 만드려면 outer class 객체를 통해 만들어야 한다
// 그렇기 때문에 내부클레스에 static 멤버를 생성할 수 없음
// inner class 내에 멤버를 생성할 때는 outer class 의 객체를 통해 만들어야 함
// static 멤버는 외부클래스를 거치지 않기 때문에 inner class 에선 사용 불가
// InnerG inner = new InnerG(); // Error
OuterG.InnerG oi = outer.new InnerG();
oi.innerGinfo();
}
}
- outerGinfo() -
a : 1
b : 2
- innerGinfo() -
a : 1
b : 2
d : 4
class OuterS{
public static int a;
private int b;
static {
a = 1;
}
public OuterS() {
b = 2;
}
public void outerGinfo() {
System.out.println("- outerGinfo() -");
System.out.println("a : " + a);
System.out.println("b : " + b);
}
static class InnerS{
public static int c;
private int d;
static { c = 3; }
public InnerS() { d = 4;}
public void innerSinfo() {
System.out.println("- innerSinfo() -");
System.out.println("a : " + a);
// outter class 에 있는 일반 멤버를 사용할 수 없음
// outer 객체의 멤버를 외부에서 사용 할 수 없음
// System.out.println("b : " + b);
System.out.println("c : " + c);
System.out.println("d : " + d);
}
}
}
// 객체를 생성하지 않고 쓸 수 있음
class MySystem {
static final class Inner {
public void println(String message) {
System.out.println(message);
}
}
static final Inner out = new Inner();
}
public class Ex02Static {
public static void main(String[] args) {
OuterS.InnerS oi = new OuterS.InnerS();
MySystem.out.println("안녕 나는 마이시스템 프린트 메소드야");
}
}
안녕 나는 마이시스템 프린트 메소드야
지역 중첩 클래스
class OuterL{
private int a;
public OuterL() { a=1;}
public void info() {
class Local{
private int b;
public Local() { b = 2; }
public void localInfo() {
System.out.println("a : " + a);
System.out.println("b : " + b);
}
}// class Local
Local li = new Local();
li.localInfo();
} // info()
}
public class Ex03Local {
public static void main(String[] args) {
OuterL ol = new OuterL();
ol.info();
}
}
a : 1
b : 2
익명 중첩 클래스
객체를 생성하면서 내부에 있는 메소드의 기능을 바꿀 수 있음
오버라이드와 같은 기능?
class Anony{
public void info() {
System.out.println("- annoy info() -");
}
}
public class Ex04Anonymous {
public static void main(String[] args) {
// 아래와 같이 객체를 생성하는 것과 같이 작성 후
// ;(세미콜론) 이 아니라 {}를 쓰고 내부에 메소드를 재정의 한 후
// 중괄호를 닫고 ;(세미콜론) 을 찍어준다
// 아래와 같이 작성하면 클래스가 만들어짐
// -> bin 폴더에 클래스명에 $가 추가된 파일이 추가된다
// 상속 없이 메소드의 기능을 바꿔야할 때 사용
Anony anony = new Anony() {
public void info() {
System.out.println("즐거운 하루");
}
};
anony.info();
}
}
즐거운 하루

< API.txt >
Java 프로그램 개발에 사용되는 class, interface 의 모음
Java 에서 기본적으로 제공되는 라이브러리이고, class 는 모두 package 에 들어 있다.
// 11 은 JDK 버젼
위의 URL을 타고 들어가 모르는 것을 찾아볼 수 있음
기본적으로 쓰는 것들은 java.base 모듈에 있음
들어가 보면 package 항목들이 나열됨
8버젼 스타일이 편할 수 있으므로 11->8로 바꾸면 됨
Object
package ch01_Object;
//이 패키지는 임포트하지 않아도 자동으로 임포트 되도록 되어 있음
import java.lang.*;
// - public class ExObject extends Object{
public class ExObject {
public static void main(String[] args) {
Object objA = new Object();
Object objB = new Object();
// getClass() : class type 를 return
System.out.println("objA.getClass() : "+objA.getClass());
System.out.println();
// hashCode() : 객체 고유번호 / 10진수
// 이 hashCode 는 절대 중복 될 수 없음
System.out.println("objA.hashCode() : " + objA.hashCode());
System.out.println("objB.hashCode() : " + objB.hashCode());
// toString() : getClass(), hashCode() 조합
// 일반 hashCode 는 10진수
// toString 의 hashCode는 16진수로 변환되어 나옴 0 ~ 9 - a ~ f
System.out.println("objA.toString() : "+ objA.toString());
System.out.println("objA : " + objA); // reference
System.out.println("objB.toString() : "+ objB.toString());
// equals() : 동일한 객체인지 확인
System.out.println("objA.equals(objB) : " + objA.equals(objB));
}
}
objA.getClass() : class java.lang.Object
objA.hashCode() : 366712642
objB.hashCode() : 1829164700
objA.toString() : java.lang.Object@15db9742
objA : java.lang.Object@15db9742
objB.toString() : java.lang.Object@6d06d69c
objA.equals(objB) : false
package ch01_Object;
public class Product {
private String serial; // 제품 고유 번호
private int value;
public Product(String serial) {
this.serial = serial;
}
// 변수명으로 해서 객체정보를 얻을 때
@Override
public String toString() {
return "제품번호 - " + serial;
}
public void showSerial() {
System.out.println("제품번호 - " + serial);
}
@Override
public int hashCode() {
return serial.hashCode() + value;
}
// 매개변수가 Object 면 편리한 점
// Object class 가 최상위 클래스이기 때문에 모든 객체를 받을 수 있음
// 이런식으로 추가할 수 있음
// 객체안의 객체를 비교할 때
@Override
public boolean equals(Object obj) {
if(obj instanceof Product) { // 같은 타입인지 확인
Product tmp = (Product)obj; // 원래 타입으로 변환
if(this.serial.equals(tmp.serial)) { // 내용물이 같은지 확인
return true;
}
if(this.value == tmp.value) { // 내용물이 같은지 확인
return true;
}
}
return false;
}
}
package ch01_Object;
public class ProductMain {
public static void main(String[] args) {
Product proA = new Product("001");
Product proB = new Product("002");
Product proC = new Product("001");
proA.showSerial();
proB.showSerial();
proC.showSerial();
System.out.println(proA.equals(proB));
System.out.println(proA.equals(proC));
System.out.println(proA.equals(proB));
System.out.println(proA.equals(proC));
System.out.println(proA);
System.out.println(proB);
System.out.println(proC);
}
}
제품번호 - 001
제품번호 - 002
제품번호 - 001
true
true
true
true
제품번호 - 001
제품번호 - 002
제품번호 - 001
Car class 를 정의하고, CarMain class 에서 테스트
- 제조회사, 모델명의 관리가 가능
- 제조회사, 모델명이 같으면 동일한 차량으로 판단
- 변수명을 사용해서 차량 정보를 확인 가능
package ch01_Object;
public class Car {
private String company;
private String model;
public Car(String company, String model) {
this.company = company;
this.model = model;
}
public String toString() {
return "제조회사 : " + company + " - 모델명 : " + model;
}
public int hashCode() {
return company.hashCode() + model.hashCode();
}
public boolean equals(Object obj) {
if(obj instanceof Car) {
Car tmp = (Car)obj;
// 비교 할 것이 너무 많아지면 가로로 길어져서 보기에 나쁨
// 강사님의 코드처럼 if 문 만 추가하면 됨
// 가로로 길때의 단점 : Error가 발생했을 때 찾기 힘듬
if(this.company.equals(tmp.company)&&this.model.equals(tmp.model)) {
return true;
}
}
return false;
}
}
package ch01_Object;
public class CarMain {
public static void main(String[] args) {
Car avang1 = new Car("현대", "avente");
Car avang2 = new Car("현대", "avente");
Car avang3 = new Car("현대", "aventeN");
Object obj = new Car("asdasd", "asd");
System.out.println(avang1);
System.out.println(avang2);
System.out.println(avang3);
System.out.println();
System.out.println(avang1.hashCode());
System.out.println(avang2.hashCode());
System.out.println(avang3.hashCode());
System.out.println();
System.out.println(avang1.toString());
System.out.println(avang2.toString());
System.out.println(avang3.toString());
System.out.println();
System.out.println(avang1.equals(avang2));
System.out.println(avang1.equals(avang3));
System.out.println(avang2.equals(avang3));
}
}
제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : aventeN
-1404101621
-1404101621
-629804773
제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : aventeN
true
false
false
package ch01_ObjectQuizT;
public class Car {
private String company; // 제조회사
private String model; // 모델명
public Car(String company, String model) {
this.company = company;
this.model = model;
}
public int hashCode() {
return company.hashCode() + model.hashCode();
}
public boolean equals(Object obj) {
if (obj instanceof Car) {
Car tmp = (Car) obj;
// 이런식으로 작성했을 때 if문이 순차적으로 돌아가다가
// 하나라도 다른게 나오면 return false; 하기 때문에 바로 false 반환
if (!company.equals(tmp.company))
return false;
if (!model.equals(tmp.model))
return false;
return true;
}
return false;
}
public String toString() {
return "제조회사 : " + company + " - 모델명 : " + model;
}
}
package ch01_ObjectQuizT;
public class CarMain {
public static void main(String[] args) {
Car carA = new Car("kia", "ev6");
Car carB = new Car("kia", "ev9");
Car carC = new Car("kia", "ev6");
System.out.println(carA.equals(carB));
System.out.println(carA.equals(carC));
System.out.println();
System.out.println(carA);
System.out.println(carB);
}
}
false
true
제조회사 : kia - 모델명 : ev6
제조회사 : kia - 모델명 : ev9
package ch02_String;
public class ExString {
public static void main(String[] args) {
String stnA = "Java";
String stnB = new String("Java");
String stnC = "java";
// String 클래스에서는 Override가 되어있기 때문에
// 변수명만 출력하면 변수에 담겨있는 문자열이 출력되도록 재정의
System.out.println(stnA);
System.out.println(stnB);
System.out.println(stnC);
System.out.println();
// 문자열이 hashCode로 변환되어 있기 때문에 같은 문자열이면 같은 int 값 나옴
System.out.println(stnA.hashCode());
System.out.println(stnB.hashCode());
System.out.println(stnC.hashCode());
System.out.println();
// equals() : 같은 문자열인지 확인
// String 에서 Override가 되어 문자열이 같은지 비교함
System.out.println(stnA.equals(stnB));
System.out.println(stnA.equals(stnC));
System.out.println();
String title = "자바 program";
System.out.println("title : " + title);
System.out.println("title 문자수 : " + title.length());
System.out.println();
// 특정 문자열이 청므으로 나타는 위치
int title_pos = title.indexOf("p");
System.out.println("p 위치 : " + title_pos);
// 특정 문자열이 마지막으로 나타나는 위치
int title_lastPos = title.lastIndexOf("r");
System.out.println("r 마지막 위치 : " + title_lastPos);
System.out.println();
// 특정 문자열 변경
String new_title = title.replace("자바", "Java");
System.out.println("new_title : " + new_title);
System.out.println();
String phone = "010-1234-5678";
System.out.println("phone : " + phone);
// 문자열 자르기
// (시작위치, 마지막 위치)
String pa = phone.substring(4, 8); // 시작 index ~ (마지막 index -1)
String pb = phone.substring(9); // 시작 index ~ 끝까지
System.out.println("앞 4자리 : " + pa);
System.out.println("뒤 4자리 : " + pb);
System.out.println();
String email = "test@abc.com";
System.out.println("E-mail : " + email);
// @ 위치
int at = email.indexOf("@");
System.out.println("@ 위치 : " + at);
// ID
String id = email.substring(0, at);
System.out.println("ID : " + id);
// Domain
String domain = email.substring(at + 1);
System.out.println("Domain : " + domain);
System.out.println();
// 문자열 내 특정 문자열을 기준으로 잘라서 배열에 넣기
String[] ar = phone.split("-");
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
}
}