예외 : 실행 시간 도중 발생한 오류
try-catch-finally 사용
public static void main(String[] args) {
try {
//예외 발생 가능성이 있는 실행문
}catch(Exception e) {
//예외 처리문
} finally {
// 예외 발생 여부와 상관없이 무조건 실행할 문장
}
}
catch 문에서는 예외 타입을 선언한다
예외 타입을 모르겠으면 예외를 발생시켜 보고 확인해서 선언해도 된다.
예를 들어 0으로 나눠서 발생하는 예외는
ArithmeticException 타입을 사용하면 된다.
부모 클래스(슈퍼 클래스) -> 자식 클래스(서브 클래스)
extends 키워드로 상속
class Person{
String name;
int age;
}
class Man extends Person{
String gender;
}
Java 상속의 특징
일반적으로 private 멤버에 접근하기 위해서 getter와 setter를 정의함.
서브 클래스의 생성자를 호출할 때 슈퍼 클래스의 생성자도 호출됨
호출 순서 : 서브 클래스 생성자 -> 슈퍼 클래스 생성자
실행 순서 : 슈퍼 클래스 생성자 -> 서브 클래스 생성자
class Person{
String name;
int age;
public Person() {
name = "defaultName";
age = 1;
}
public Person(String n,int a) {
name = n;
age = a;
}
}
class Man extends Person{
String gender;
public Man(String n,int a,String g) {
//super를 이용해 슈퍼 클래스의 생성자 중 두번째를 호출
super(n,a);
gender = g;
}
}
super는 슈퍼 클래스의 생성자를 호출할 때 뿐만 아니라 슈퍼 클래스의 멤버에 접근하기 위해 사용할 수도 있다.
super.멤버명
의 형태로 참조할 수 있다.
서브 클래스 객체는 슈퍼 클래스 객체 취급 가능
슈퍼 클래스의 레퍼런스 변수로 서브 클래스 객체를 가리킬 수 있다. (자동 형변환 된다)
이렇게 하면 컴파일러는 객체를 슈퍼 클래스 객체로 인식한다.
따라서 슈퍼 클래스의 멤버에만 접근할 수 있다.
class Person{
String name;
int age;
public Person() {
name = "defaultName";
age = 1;
}
public Person(String n,int a) {
name = n;
age = a;
}
}
class Man extends Person{
String gender;
public Man(String n,int a,String g) {
//super를 이용해 슈퍼 클래스의 생성자 중 두번째를 호출
super(n,a);
gender = g;
}
}
public class test {
public static void main(String[] args) {
Man m = new Man("haerin",20,"women");
//슈퍼 클래스의 레퍼런스 변수인 p로 자식 클래스 객체인 m을 가리킴
Person p = m;
System.out.println(p.name);
}
}
다운캐스팅은 업캐스팅 된 객체를 다시 서브 클래스로 형변환 하는 것이다. 명시적 형 변환을 통해 이루어진다.
업캐스팅 된 객체가 아닌 그냥 슈퍼 클래스 객체를 다운캐스팅 하면 예외 발생함
즉 위의 예시에서 p를 다시 (Man)p 로 다운캐스팅 할 수 있다.
instance of 로 레퍼런스 변수가 어떤 클래스 타입인 지 확인할 수 있다.
결과로 boolean 값을 반환한다.
메소드 오버라이딩은 슈퍼 클래스의 메소드를 서브 클래스에서 재정의하는 것이다.
메소드 이름, 매개변수, 반환형 등 모든 내용을 동일하게 작성하고 내용만 바꾼다.
메소드를 호출하면 서브 클래스에 오버라이딩 된 메소드가 호출되는 동적 바인딩이 발생한다. 즉 run time에 호출될 메소드가 결정된다.
객체의 레퍼런스 타입에 상관없이 실제 클래스타입(생성한 타입)에 따라 메소드가 호출된다.
또한 메소드를 오버라이딩 할 때는 어노테이션 @Override를 붙이는 것이 좋다.
<오버로딩의 조건>
1. 메소드의 이름이 같아야 합니다.
주의 : 반환 타입과는 상관없다
abstract 키워드 사용
선언은 되어 있으나 구현하지 않은 메소드다.
상속해서 서브 클래스에서 오버라이딩으로 구현해야 한다.
추상 클래스 추상 메소드가 하나 이상 포함된 클래스는
abstract 키워드를 붙여서 추상 클래스로 만들어야 한다.
추상 클래스는 객체를 생성할 수 없다.
추상 클래스를 상속한다고 무조건 추상 클래스가 되지는 않는다. 하지만 상속하고 나서 추상 메소드를 구현하지 않으면 추상 클래스가 된다.
상속은 속성(멤버변수)와 기능(멤버함수)를 모두 상속한다.
반면에 인터페이스는 기능만 상속하기 위해 존재한다.
인터페이스는 클래스가 구현해야 할 메소드들이 선언되는 추상형이다.
interface 키워드로 선언
implements 키워드로 상속
구성요소는
(public static) final 상수
(public abstract) 메소드
(public) default 메소드
로 구성된다. 괄호친 부분은 선언할 때 생략할 수 있다.
또한 괄호친 부분을 생략해서 선언하더라도 상속받는 클래스에서 메소드를 재정의 할 때는 public을 붙여야 한다.
default 메소드는 인터페이스 내에서 구현하는 메소드다. default 메소드는 상속하는 클래스에 자동으로 상속된다.
인터페이스는 멤버변수를 정의할 수 없다.
또한 protected 나 private 으로 선언할 수 없다.
인터페이스 객체는 생성할 수 없지만 인터페이스 타입의 레퍼런스는 생성할 수 있다.
패키지가 필요한 이유는 다른 패키지에 있으면 이름이 같아도 다른 클래스로 취급해서 오류를 줄일 수 있음
package 키워드로 패키지 선언
소스 파일의 첫 줄에 선언한다
이 선언은 소스파일을 컴파일 한 클래스파일(.class)을 패키지 디렉토리를 만들어서 그 위치에 저장하라는 의미이다.
즉 패키지는 서로 관련된 클래스들의 컴파일된 바이트코드 파일을 하나의 디렉토리에 묶어 놓은 것이다.
import 패키지명.클래스명
예시) import java.util.Scanner;
또한 *
를 이용해서 패키지의 모든 클래스를 포함할 수도 있다.
예시) import java.util.*;
java.lang
자바 language 패키지 (스트링, 수학 함수, 입출력 등 기본적인 클래스와 인터페이스)
자동으로 import 된다
java.util
자바 유틸리티 패키지이다.
날짜, 시간, 벡터, 해시맵 등 다앙햔 유틸리티 클래스, 인터페이스를 포함한다.
java.io
키보드, 모니터, 프린터 등 입출력을 할 수 있는 클래스, 인터페이스
모든 클래스에 강제로 상속됨. 즉 모든 클래스의 슈퍼클래스
자바의 기본 타입을 클래스화 한 것이 Wrapper 클래스다
Byte
Short
Integer
Long
Character
Float
Double
Boolean
Wrapper 객체는 new로 생성할 수 없다.
valueOf()메소드를 사용한다.
값 대신 문자열을 넣어도 됨
Integer num = Integer.valueOf(10);
Integer num = Integer.valueOf("10");
//int to characeter (값, 진수)
char a = Character.forDigit(7,10);
Wrapper 클래스의 메소드는 대부분 static 메소드여서
클래스명.메소드명()으로 호출한다.
Integer num = Integer.valueOf(10);
int a = num.intValue();
int b = Integer.parseInteger("10");
//2진수로 변환
int binary = Integer.parseInt("101010",2);
String c = Integer.toString(10);
int를 예시로 들면
intValue 메소드로 기본 자료형의 값을 알 수 있다.
parseInteger 메소드로 문자열을 기본 자료형 값으로 변환할 수 있다.
toString 메소드로 기본 자료형 값을 문자열로 바꿀 수 있다.
모듈은 여러 패키지, 이미지 등의 자원을 모아 놓은 컨테이너다
.jmod 확장자를 갖는다.
클래스를 모아서 패키지를 만들고, 패키지를 모아서 모듈을 만듬
java API는 여러 모듈로 나눠져 있어서 그중에 필요한 모듈만 골라서 실행환경을 구축할 수 있다.
java.lang.String (자동으로 포함)
스트링 생성 방법
리터럴로 생성
String s = "Hello"
JVM에 리터럴 테이블에 생성된다.
같은 값의 스트링은 리터럴을 공유하는 형태가 된다
String 객체로 생성
String s = new String("Hello");
힙 메모리에 생성한다
같은 값의 스트링이어도 객체는 따로 생성된다.
String 클래스와 달리 문자열을 변경할 수 있다
객체의 크기는 스트링 길이에 따라 가변적임
split 함수를 이용해 String을 구분자를 기준으로 나눠서 배열에 담을 수 있다.
ArrayList, HashMap 등을 사용할 수 있다.