추상 클래스 (abstract class)

미완성 설계도, 추상 메서드를 포함하고 있는 클래스

  • 추상 메소드 - 선언부만 있고 구현되지 않은 메소드, 필요하지만 자손마다 다르게 구현될 경우 사용

예제

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 의자("흔들 의자");
        
    }
}

인터페이스 (interface)

일종의 추상클래스, 구현된 것이 전혀 없는 기본 설계도

예제 코드

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 갤럭시();
    }
}

내부 static 클래스 예제

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 클래스 - 사용자의 실수와 같은 외적인 이유로 발생 (예외처리 필수)


    에러는 어쩔 수 없지만 예외는 처리해야 한다.

try-catch문 예제

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("예외 발생");
       }
   }
}

finally 예제

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);
   }   
}

try(AutoCloseable 객체)

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("다음");
   }
}

Java.lang 패키지

String.

예제

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라

스트링 비교 시 주의

Math.

예제

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
profile
유승한

0개의 댓글