미완성 설계도, 추상 메서드를 포함하고 있는 클래스
- 추상 메소드 - 선언부만 있고 구현되지 않은 메소드, 필요하지만 자손마다 다르게 구현될 경우 사용
package ch07;
// 추상적 클래스
// abstract class는 '종족'을 의미한다
abstract class 가구 {
String name;
}
// 구체적 클래스
class 의자 extends 가구 {
public 의자(String name){
this.name = name;
}
}
public class S07 {
public static void main(String[] args) {
// 추상 클래스는 인스턴스화 할 수 없다
// new 가구();
의자 chair = new 의자("시디즈 의자");
가구 chair1 = new 의자("흔들 의자");
}
}
일종의 추상클래스, 구현된 것이 전혀 없는 기본 설계도
package ch07;
// 인터페이스는 '기능'
// 여러 클래스에 적용 가능
interface 입 {
void cry();
}
interface 눈 {
void see();
}
interface 날개 {
void fly();
}
// 기능이 있다는 것만 알려줌, 구현은 자손 클래스에서
// 인터페이스들이 모이면 종족의 특성이 될 수 있다
abstract class 사람 implements 입, 눈 {
}
class 홍길동 extends 사람 {
@Override
public void cry() {
}
@Override
public void see() {
}
}
class 천사 extends 사람 implements 날개 {
@Override
public void cry() {
}
@Override
public void see() {
}
@Override
public void fly() {
}
}
// 인터페이스는 클래스에서 여러개 구현 가능
class Cat implements 입, 눈 {
@Override
public void cry() {
System.out.println("야옹");
}
@Override
public void see() {
System.out.println("고양이가 봅니다");
}
}
class Dog implements 입, 눈 {
@Override
public void cry() {
System.out.println("멍멍");
}
@Override
public void see() {
System.out.println("강아지가 봅니다");
}
}
public class S08 {
}
package ch07;
// 인터페이스 / 추상 클래스 / 클래스 이용
// 스마트폰
// 갤럭시 / 아이폰
// 갤럭시 - 통화 / 문자 / 빅스비
// 아이폰 - 통화 / 문자 / 시리
// 갤럭시 - S23
// 아이폰 - IPhone 14
interface Call {
void call();
}
interface Mail {
void mail();
}
interface Bixby {
void bixby();
}
interface Siri {
void siri();
}
abstract class Phone implements Call, Mail {
}
abstract class Galaxy extends Phone implements Bixby {
}
abstract class IPhone extends Phone implements Siri {
}
class S23 extends Galaxy {
@Override
public void call() {
System.out.println(this.getClass().getName() + " 전화 시작");
}
@Override
public void mail() {
System.out.println(this.getClass().getName() + " 문자 보내기");
}
@Override
public void bixby() {
System.out.println("하이 빅스비");
}
}
class IPhone14 extends IPhone {
@Override
public void call() {
System.out.println(this.getClass().getName() + " 전화 시작");
}
@Override
public void mail() {
System.out.println(this.getClass().getName() + " 문자 보내기");
}
@Override
public void siri() {
System.out.println("시리야");
}
}
public class S08Quiz {
}
클래스 안에 선언된 클래스
package ch07;
// 내부 클래스 중 인스턴스 클래스는
// 메모리 누수 등 문제 발생 가능성, 특별한 때 아니면 안씀
// 삼성공장
// 갤럭시 생산
// 외부 클래스
// 공장 설계도
class 삼성공장{
// 내부 클래스
// static 없는 인스턴스 클래스
// 스마트폰 설계도
class 갤럭시 {
}
class 르노삼성 {
}
}
public class S09 {
public static void main(String[] args) {
// 공장 설계도에서 폰을 만들어 내는 것
// 만들어지지 않음
// new 삼성공장.갤럭시();
// 공장을 상상
삼성공장 factory;
// 공장을 지음
factory = new 삼성공장();
// 공장에서 갤럭시 생산
삼성공장.갤럭시 phone = factory.new 갤럭시();
삼성공장.르노삼성 car = factory.new 르노삼성();
factory = null;
삼성공장 factory1 = new 삼성공장();
factory1.new 갤럭시();
}
}
package ch07;
// 클래스는 아무것도 안 적어도 static
// package랑 같은 기능
class 종이접기책목차 {
// 학 접는 방법 (class)
// 방법 대로 만들면 종이 학 (instance)
static class 학 {
}
}
public class S10 {
public static void main(String[] args) {
// 클래스의 내부 static 클래스가 실제 클래스이고
// 외부의 클래스는 내부 static 클래스에 접근할 경로를 제공하는 느낌
// 외부의 클래스는 내부 static 클래스의 패키지와 비슷
종이접기책목차.학 bird = new ch07.종이접기책목차.학();
}
}
에러
- 프로그램 코드로 수습 불가능한 심각한 오류
예외
프로그램 코드로 수습 가능한 미약한 오류
종류
RuntimeException 클래스 - 프로그래머의 실수로 발생 (예외처리 선택)
Exception 클래스 - 사용자의 실수와 같은 외적인 이유로 발생 (예외처리 필수)
에러는 어쩔 수 없지만 예외는 처리해야 한다.
package ch08;
// 예외처리
public class S01 {
public static void main(String[] args) {
System.out.println("이전 코드");
// try 예외가 일어날 것 같은 코드
try{
// 예외가 일어날 수 있는 코드
System.out.println(10 / 0);
// catch 특정 예외 발생 시 실행하고 넘김 (프로그램 중지 X)
} catch (ArithmeticException e){
System.out.println("계산 중 예외 발생");
}
System.out.println("다음 코드");
}
}
package ch08;
public class S02 {
public static void main(String[] args) {
int[] intArr = { 10, 20 };
try{
// 여기서 에러 발생
System.out.println(10 / 0);
// 밑으로 안 내려감
System.out.println(intArr[2]);
} catch (ArithmeticException e) {
System.out.println("인덱스 값 예외 발생");
}
try {
System.out.println(intArr[2]);
System.out.println(10 / 0);
// 발생할 수 있는 모든 에러에 대해 각각 처리해주는 것이 좋다
} catch (ArithmeticException e) {
System.out.println("계산 예외 발생");
} catch (ArrayIndexOutOfBoundsException e1) {
System.out.println("배열 검색 범위 넘어섬");
}
try {
System.out.println(intArr[2]);
System.out.println(10 / 0);
// 중요한 코드가 아닐 시
// 한꺼번에 처리 가능
// 예외 클래스 최상위 Exception
} catch (Exception e) {
System.out.println("예외 발생");
}
}
}
package ch08;
import java.util.InputMismatchException;
import java.util.Scanner;
// finally
public class S03 {
public static void main(String[] args) {
// 스캐너 -> 마지막에 꼭 close() 해줘야 함
Scanner scanner = new Scanner(System.in);
int num;
try {
num = scanner.nextInt();
} catch (InputMismatchException e) {
num = 0;
System.out.println("정수가 아님");
// finally는 try안의 모든 변수와 관련된 객체가
// 무조건 처리되어야 할 경우
// try 안의 코드가 예외 발생하든 안하든 무조건 실행
} finally {
scanner.close();
}
System.out.println(num);
}
}
AutoCloseable를 상속받는 객체는 'try(객체이름)' 형식으로 사용하여
close없이 저절로 닫히게 할 수 있다.
try (Scanner scanner = new Scanner(System.in)) {
num = scanner.nextInt();
} catch (InputMismatchException e) {
num = 0;
System.out.println("정수가 아님");
} // finally {
// scanner.close();
// }
package ch08;
// 예외 직접 만들기
// Exception 또는 RuntimeException을 상속하는 것이 일반적
class NotOneException extends Exception {
public NotOneException(String message) {
super(message);
}
}
class ClacUtil {
// 들어온 정수가 1이면 정살 / 아니면 에러
// throws는 이 함수를 호출한 곳에 에러를 던지겠다
static void checkOne(int num) throws NotOneException {
if (num == 1) {
System.out.println("정상입니다");
} else {
throw new NotOneException("에러 발생");
}
}
}
public class S05 {
public static void main(String[] args) {
int num = 142;
try {
ClacUtil.checkOne(num);
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("다음");
}
}
package ch09;
public class S01 {
public static void main(String[] args) {
String str = " Show me the money ";
System.out.println("str.length() : " + str.length());
System.out.println("str.charAt(1) : " + str.charAt(1));
System.out.println("str.substring(6) : " + str.substring(6));
// 주민번호 등을 잘라낼 때
// "12345678" -> "1" + "*******";
System.out.println("str.substring(6, 11) : " + str.substring(6, 11));
// 아이디 happy를 캡스록 실수로 HAPPY로 입력 시에도
// 비교할 때 toLowerCase등을 이용해서 처리 가능
System.out.println("str.toLowerCase() : " + str.toLowerCase());
System.out.println("str.toUpperCase() : " + str.toUpperCase());
System.out.println("str.indexOf(\"e\") : " + str.indexOf("e"));
System.out.println("str.lastIndexOf(\"e\") : " + str.lastIndexOf("e"));
System.out.println("str.contains(\"the\") : " + str.contains("the"));
System.out.println("str.startsWith(\"Show\") : " + str.startsWith("Show"));
System.out.println("str.endsWith(\"money\") : " + str.endsWith("money"));
// 좌우 공백 제거
System.out.println("str.trim() : " + str.trim());
System.out.println("str.replace(\"e\", \"x\") : " + str.replace("e", "x"));
System.out.println("str.repeat(2) : " + str.repeat(2));
// split을 하면 기준이 된 문자는 제거
System.out.println("str.split(\" \").length : " + str.split(" ").length);
System.out.println("str.split(\" \")[0] : " + str.split(" ")[0]);
System.out.println("str.split(\" \")[1] : " + str.split(" ")[1]);
System.out.println("str.split(\" \")[4] : " + str.split(" ")[4]);
String name1 = "홍 길 동";
System.out.println("name1.split(\" \").length : " + name1.split(" ").length);
String name2 = "cocacola";
System.out.println("name2.split(\"\").length : " + name2.split("").length);
// 값이 없는 빈 문자열("")만 true
System.out.println("\"\".isEmpty() : " + "".isEmpty());
System.out.println("\" \".isEmpty() : " + " ".isEmpty());
// ""과 " " 둘 다 true
System.out.println("\"\".isBlank() : " + "".isBlank());
System.out.println("\" \".isBlank() : " + " ".isBlank());
String bird1 = "오리";
String bird2 = "오리";
System.out.println("bird1 == bird2 : " + (bird1 == bird2));
String bird3 = "독수리";
System.out.println("bird3 == \"독수리\" : " + (bird3 == "독수리"));
String bird4 = new String("갈매기");
String bird5 = new String("갈매기");
System.out.println("bird4 == bird5 : " + (bird4 == bird5));
System.out.println("bird4 == \"갈매기\" : " + (bird4 == "갈매기"));
// 객체끼리 ==을 사용하면 주소를 비교하게 된다
// 객체끼리 equals를 사용하면 주소를 비교
// false면 내부의 값을 한 번 더 비교한 뒤 참거짓 리턴
// 객체끼리 비교는 equals 권장
System.out.println("bird1.equals(bird2) : " + bird1.equals(bird2));
System.out.println("bird4.equals(bird5) : " + bird4.equals(bird5));
// 문자열 / 문자 배열
String korean = "가나다라";
String[] split = korean.split("");
// 문자열의 문자(char)를 반복할 때
for (int i = 0; i < korean.length(); i++) {
System.out.print(korean.charAt(i));
}
System.out.println();
// 문자열을 배열로 바꿔서 반복할 때
// 각 문자에 문자열 메소드 사용 가능
for (int i = 0; i < split.length; i++) {
System.out.print(split[i].repeat(2));
}
System.out.println();
System.out.println("String.join(\"\", split) : " + String.join("", split));
System.out.println("String.join(\"a\", split) : " + String.join("a", split));
}
}
str.length() : 19
str.charAt(1) : S
str.substring(6) : me the money
str.substring(6, 11) : me th
str.toLowerCase() : show me the money
str.toUpperCase() : SHOW ME THE MONEY
str.indexOf("e") : 7
str.lastIndexOf("e") : 16
str.contains("the") : true
str.startsWith("Show") : false
str.endsWith("money") : false
str.trim() : Show me the money
str.replace("e", "x") : Show mx thx monxy
str.repeat(2) : Show me the money Show me the money
str.split(" ").length : 5
str.split(" ")[0] :
str.split(" ")[1] : Show
str.split(" ")[4] : money
name1.split(" ").length : 3
name2.split("").length : 8
"".isEmpty() : true
" ".isEmpty() : false
"".isBlank() : true
" ".isBlank() : true
bird1 == bird2 : true
bird3 == "독수리" : true
bird4 == bird5 : false
bird4 == "갈매기" : false
bird1.equals(bird2) : true
bird4.equals(bird5) : true
가나다라
가가나나다다라라
String.join("", split) : 가나다라
String.join("a", split) : 가a나a다a라
스트링 비교 시 주의
package ch09;
public class S02 {
public static void main(String[] args) {
// 0이상 1미만의 랜덤한
System.out.println("Math.random() : " + Math.random());
// 절댓값
System.out.println("Math.abs(-10) : " + Math.abs(-10));
// 반올림
System.out.println("Math.round(1.5) : " + Math.round(1.5));
System.out.println("Math.round(1.4) : " + Math.round(1.4));
// 내림(double 반환)
System.out.println("Math.floor(1.5) : " + Math.floor(1.5));
System.out.println("Math.floor(1.25) : " + Math.floor(1.25));
// 올림(double 반환)
System.out.println("Math.ceil(1.5) : " + Math.ceil(1.5));
System.out.println("Math.ceil(1.25) : " + Math.ceil(1.25));
System.out.println("Math.ceil(1.0) : " + Math.ceil(1.0));
// n제곱 계산(double 반환)
System.out.println("Math.pow(2, 3) : " + Math.pow(2, 3));
// 루트(double 반환)
System.out.println("Math.sqrt(4) : " + Math.sqrt(4));
// 파이값
System.out.println("Math.PI : " + Math.PI);
}
}
Math.random() : 0.7348357923139867
Math.abs(-10) : 10
Math.round(1.5) : 2
Math.round(1.4) : 1
Math.floor(1.5) : 1.0
Math.floor(1.25) : 1.0
Math.ceil(1.5) : 2.0
Math.ceil(1.25) : 2.0
Math.ceil(1.0) : 1.0
Math.pow(2, 3) : 8.0
Math.sqrt(4) : 2.0
Math.PI : 3.141592653589793