0%

프로그램 오류

  • 컴파일에러(complie-time error): 컴파일 할 때 발생하는 에러
  • 런타임 에러(runtime error): 실행 할 때 발생하는 에러
  • 논리적 에러(logical error): 작성 의도와 다르게 동작

컴파일에러

image

위의 코드에서는 System.out.println의 “S“를 소문하로 하여 컴파일 하지 못합니다.

image

에러 내용은 위와 같습니다.

런타임에러

image

  • 에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • 예외(exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

예외처리의 정의와 목적

정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

Exception과 RuntimeException

  • Excetion클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
  • RuntimeException: 프로그래머의 실수로 발생하는 예외

익명클래스(anonymous class)

  • 이름이 없는 일회용 클래스. 정의와 생성을 동시에
  • 사용법에 대해서 예제 코드를 보겠습니다.

image

  • 위의 클래스를 익명클래스로 바꿔주겠습니다.

image

내부 클래스

  • 클래스안의 클래스
  • 장점
    • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음
    • 코드의 복잡성을 줄일 수 있음(캡슐화)
1
class A { // 외부클래스
2
  ...
3
  class B { // 내부클래스
4
    ...
5
  }
6
}

종류와 특징

  • 내부 클래스의 종류와 유효범위(scope)는 변수와 동일
  • 인스턴스 내부 클래스
    • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다뤄짐. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언
  • Static 내부 클래스
    • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다뤄짐. 주로 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언
  • 지역 내부 클래스
    • 외부 클래스의 메서드나 초기화블럭안에 선언하며, 선언된 영역 내부에서만 사용될 수 있음
  • 익명클래스
    • 클래스의 선언관 객체의 생성을 동시에하는 이름없는 클래스(일회용)

내부클래스의 제어자와 접근성

  • 내부클래스의 제어자는 변수에 사용 가능한 제어자와 동일
  • 내부클래스에서 외부 클래스의 private멤버도 접근 가능

image

image

image

Interface 디폴트 메서드와 static메서드

  • 인터페이스에 디폴트메서드, static메서드 추가 기능(JDK1.8부터)

  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움

    • 해결책 => 디폴트메서드(default method)
  • 디폴트메서드는 인스턴스 메서드(인터페이스 원칙 위반)

  • interface MyInterface {
      void method();
      void newMethod(); // 추상메서드
    }
    
    

interface MyInterface {
void method();
default void newMethod() {}
}


- 디폴트 메서드가 기존의 메서드와 출돌할 때의 해결책

  1. 여러 인터페이스의 디폴트 메서드간의 충돌
  2. 디폴트 메서드와 조상 클래스의 메서드간의 충돌

  - 해결: 그냥 직접 오버라이딩하면 해결됨

JDBC란?

Java Database Connectivity

자바 프로그램이 데이터베이스와 연결되어 데이터를 주고 받을 수 있게 해주는 프로그래밍 인터페이스

JDBC 역할

  • 통역자의 역할: 응요프로그램과 DBMS간의 통신을 중간에서 번역해주는 역할
  • 데이터베이스 종류와 상관없음

image

java.sql Package

  1. java .sql.Driver
    • DB와 연결하는 Driver class를 만들 때 반드시 implements해야 하는 Interface로 JDBC드라이버의 중심이 되는 Interface
  2. java.sql.Connection
    • 특정 데이터베이스와 연결정보를 가지는 Interface
    • DriverManager로부터 Connection객체를 가져옴
  3. java.sql.Statement
    • SQL query문을 DB에 전송하는 방법을 정의한 Interface
    • Connection을 통해 가져옴
  4. java.sql.ResultSet
    • SELECT구문 실행 결과를 조회할 수 있는 방법을 정의한 Interface
  5. java.sql.PreparedStatement
    • Statement의 하위 Interface
    • SQL문을 미리 컴파일하여 실행 속도를 높임
  6. java.sql.CallableStatement
    • PreparedStatement의 하위 Interface
    • DBMS의 Stored procedure을 호출

JDBC개발단계

  1. JDBC Driver loading
    • 데이터베이스 벤더와 맞는 드라이버를 호출
    • 데이터베이스와의 연결을 위해 드라이버 로딩
  2. Connection
    • DB와 연결을 위해 URL과 계정정보가 필요
    • 연결 메소드로는 DriverManager.getConnection(url, id, pwd) : Connection
  3. Statement / PreparedStatement
    • SQL구문을 정의하고 변경될 값은 치환문자를 이용해 쿼리전송전에 값을 setting함
  4. executeUpdate() or executeQuery()
    • executeUpdate()는 SQL Query문이 INSERT, DELETE, UPDATE의 경우레 사용. 반환값의 타입은 int형
    • executeQuery()는 SQL Query문이 SELECT의 경우에 사용. 반환값의 타입은 ResultSet
  5. ResultSet( SELECT의 경우 )
    • 데이터베이스 조회 결과집합에 대한 표준
    • next()를 통해 DB의 table안에 row한 줄을 불러옴
    • getString(), getInt()를 통해 한 행의 특정 Column값을 가져옴

image

  1. close( Connection, Statement, ResultSet )
    • Connection, Statement, ResultSet에 대해 close를 함

[참고](

인터페이스의 장점

  • 개발 시간 단축
  • 변경에 유리한 유연한 설계 가능
  • 표준화가 가능
  • 서로 관계없는 클래스들을 관계 맺어줄 수 있음

선언과 구현 분리

1
class B {
2
  public void method() {
3
    System.out.println("methodInB");
4
  }
5
}
1
//선언
2
interface I {
3
  public void method();
4
}
5
6
//구현
7
class B implements I {
8
  public void method() {
9
    System.out.println("methodinB");
10
  }
11
}

예제)

  • A가 B에 의존할 경우, 인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 된다.(느슨한 결합)
  • 변경에 유리함

image

개발 시간 단축

image

  • A가 B를 사용하기 위해서 B가 완성될때까지 기다려야 함.

image

  • A가 I를 사용함으로써 B가 개발 안됐어도 I를 호출(B가 완성됐다고 가정하고 개발)
  • 캡슐화 / iv에 직접 접근하지 않고 method를 통해서 접근하기 때문에 상관없음

image

1
void repair(Repairable r) {
2
  if (r instanceof Unit) {
3
    Unit u = (Unit)r;
4
    while(u.hitPoint != u.MAX_HP){
5
      u.hitPoint++; //Unit의 HP를 증가시킴
6
    }
7
  }
8
}

사진, 그림: 자바의정석저자 [남궁성님 유투브강의](

인터페이스를 이용한 다형성

  • 인스턴스도 구현 클래스의 부모로 봄
  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
1
class Fighter extends Unit implements Fightable {
2
  public void move(int x, int y) { /* 내용 생략 */}
3
  public void attack(Fightable f) { /* 내용 생략 */}
4
}
5
// 인터페이스의 구현부는 비어있기 때문에 충돌x
6
7
Unit u = new Fighter();
8
Fighter f = new Fighter();
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있음
1
Fighter method(){
2
  ...
3
  Fighter f = new Fighter();
4
  return f;
5
}

인터페이스

  • 추상 메서드의 집합 / 상수, static메서드, default메서드
  • 구현된 것이 전혀 없는 설계도. 껍데기 (모든 멤버가 public)
1
interface 인터페이스이름 {
2
  public static final 타입 상수이름 = 값; // 상수
3
  public abstract 메서드이름(매개변수목록); // 추상메서드
4
}
1
interface PlayingCard {
2
  public static final int SPADE = 4; 
3
  final int DIAMOND = 3; // public static final int DIAMOND = 3;
4
  static int HEART = 2; // public static final int HEART = 2;
5
  int CLOVER = 1; // public static final int CLOVER = 1;
6
  
7
  public abstract String getCardNumber();
8
  String getCardKind(); // public abstract String getCardKind();
9
}

인터페이스와 추상클래스의 차이

  • 추상클래스: 일반 클래스인데 추상 메서드를 갖고 있음
  • 인터페이스: 추상 메서드만 갖고 있음
  • iv의 소유할 수 있는지, 없는지

인터페이스와 추상클래스의 공통점

  • 추상메서드를 갖고 있음

인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님)
  • 다중 상속이 가능(추상메서드는 충동해도 상관 없음(구현부의 내용이 없기때문))
1
interface Fightable extends Movable, Attackable{}
2
3
interface Movable {
4
  /* 지정된 위치(x, y)로 이동하는 기능의 메서드 */
5
  void move(int x, int y);
6
}
7
8
interface Attackable {
9
  /* 지정된 대상을 공격하는 기능의 메서드 */
10
  void attack(Unit u);
11
}

인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 완성하는 것 = 구현
1
class 클래스이름 implements 인터페이스이름 {
2
  // 인터페이스에 정의된 추상메서드를 모두 구현해야 함
3
}
1
class Fighter implements Fightable {
2
  public void move(int x, int y) {/* 내용생략 */}
3
  public void attack(Unit u) { /* 내용생략 */ }
4
}
5
// 이때 Fighter클래스는 Fightable인터페이스를 구현했다고 표현함
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함
1
abstract class Fighter implements Fightalbe {
2
  public void move(int x, int y){ /* 내용생략 */ }
3
  // 생략되어 있지만 사실 존재함
4
  // public abstract void attack(Unit u);
5
}

추상클래스(abstract class)

  • 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
1
abstract class Player{ // 추상클래스(미완성 클래스)
2
  abstract void play(int pos); // 추상메서드(몸통{}이 없는 미완성 메서드)
3
  abstract void stop(); // 추상메서드
4
}
  • 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가
1
Player p = new Player(); // 에러. 추상 클래스의 인스턴스 생성 불가
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
  • 구현: 상속한 추상메서드의 몸통{}을 채워주는 것
1
class AudioPlayer extends Player {
2
  void play(int pos) {
3
    /* 내용생략 */
4
  } // 추상메서드를 구현
5
  void stop(){
6
    /* 내용 생략 */
7
  }
8
} // 추상메서드를 구현
9
10
AudioPlayer ap = new AudioPlayer(); // OK

추상 메서드(abstract method)

  • 미완성 메서드. 구현부(몸통{}가 없는 메서드
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 / 꼭 사용해야하는 강제성부여기능도 있음
1
abstract 리턴타입 메서드이름();
1
abstract class Player {
2
  abstract void play(int pos);
3
  abstract void stop();
4
}
5
6
class AudioPlayer extends Player {
7
  void play(int pos){/* 내용생략 */}
8
	void stop(){/* 내용생략 */}
9
}
10
11
abstract class AbstractPlayer extends Player {
12
  void play(int pos){/* 내용생략 */} // 추상메서드를 1개만 구현. 미완성.
13
}

image

매개변수의 다형성

  • 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음
  • 하나의 배열로 여러종류 객체를 다룸

예제

아래 코드는 하나의 배열에 여러종류의 객체를 다루는 코드입니다. 다소 사진이 작을 수 있는점 양해 바랍니다.

코드

image

실행

image

결과

image