January 04, 2021
상속
을 활용(단일 상속만 허용)인터페이스
를 활용(다중 상속과 유사한 기능 구현 가능)🗝 자바에서 다중상속이 금지된 이유는 동일한 이름의 변수가 자식 클래스에 중복되어 상속되는 것을 막기 위해서다. -> 인터페이스는 변수를 가질 수 없는 특수한 클래스이므로 다중상속을 가능하게 한다.
public interface 인터페이스명 [extends 부모인터페이스명, ...]{
// 상수 - final예약어를 사용해서 멤버 변수 선언. 인터페이스는 객체 생성 불가하므로 상수는 static 예약어를 붙여서 선언해야한다.
public static final int EXAMPLE = 1;
// 추상 메소드
public abstract void example();
}
인터페이스 변수 선언시 static final
, abstract
는 생략 가능
인터페이스는 추상 클래스와 유사하기 때문에 직접 객체화 되지 못한다.
implements
예약어[modifiers] class 클래스명 [extends 부모 클래스] [implements 인터페이스1, 인터페이스2, ...]{
}
인터페이스를 상속하는 클래스는 인터페이스에 정의된 추상 메소드들을 모두 오버라이딩 해야한다.
❗️오버라이딩 하지 않을 경우 추상 메소드가 상속되기 때문에 클래스는 추상 클래스로 선언 되어야 한다.
인터페이스 선언 시 다른 인터페이스를 상속하여 정의할 수 있다. using extends
예약어
public interface 인터페이스명 [extends 부모인터페이스1, 부모인터페이스2, …]{
}
자바의 클래스들을 분류하고, 관련된 클래스와 인터페이스를 하나의 폴더에 적절하게 배치할 때 관련된 클래스들이 묶여있는 폴더
윈도우 탐색기에서 폴더 또는 디렉토리 개념과 같다. 따라서 하나의 폴더에 동일한 이름의 파일을 두 개 이상 저장하는 것은 불가능하다.
패키지를 사용하지 않으면 비슷한 목적의 클래스 이름을 매번 다르게 생각해야하고 시스템이 복잡해질수록 클래스 파일들도 상대적으로 많이 작성된다. 이때 기능과 용도가 다른 클래스들이 모두 같은 폴더에 저장되어 있다면 관리상 어려움이 발생한다.
🗝 패키지를 적용하면 개발자가 작성한 클래스를 특정 패키지로 묶어서 관련 클래스들을 폴더 단위로 관리할 수 있다.
package
예약어// 패키지 선언 문장은 반드시 첫 번째 문장으로 기술해야한다.
package 상위 패키지명.패키지명
java.applet
: 애플릿 작성에 필요한 기능을 모은 패키지java.awt
⭐️java.io
⭐️java.lang
⭐️java.net
java.swing
java.awt
포함 내용보다 다양하고 융통성 있는 컴포넌트를 제공⭐️java.util
import
예약어import
예약어를 사용해 패키지화된 클래스를 사용하게끔 할 수 있다.java.lang
는 import 예약어
사용없이 사용 가능import
예약어를 사용하여 JVM 실행 시 클래스를 찾도록 한다.
필요로 하는 기능이 API형태로 JVM에 적재되어 있지 않은 경우 개발자가 직접 커스텀 라이브러리를 생성할 수 있다.
자바 언어를 더욱 강하게(robust)하게 만드는 요소
에러 Error
예외 Exception
자바는 객체 지향 언어이므로 예외도 객체로 처리한다. 👉 예외를 객체로 처리하기 위해 객체를 생성할 클래스가 필요
발생 가능성이 있는 모든 예외 상황을 미리 예측하여 다양한 예외 클래스를 제공한다.
기본 예외 처리 핸들러가 작동하는데, 이는 기본적으로 에러 메세지를 화면에 출력하고 실행을 중지시키는 역할만 수행한다.
모든 예외는 java.lang.Throwable
클래스의 자식 클래스인 java.lang.Exception
클래스의 자식 클래스로 만들어진다.
ArithmeticException
: 정수를 0으로 나눌 때 발생하는 산술 연산 오류IndexOutOfBoundsException
: 배열의 인덱스가 배열의 길이를 넘어서면 발생하는 오류IllegalArugumentException
: 메소드의 매개변수 유형을 잘못 사용하면 발생하는 오류IOException
: 입출력 시에 지정한 파일이 시스템에 존재하지 않으면 발생하는 오류try-catch
구문
try{
예외 발생 가능이 있는 코드;
}catch(예외 타입 매개 변수){
예외 타입의 예외가 발생할 경우 수행될 코드;
}
catch
블록의 매개변수는 예외 객체가 발생했을 때 참조하는 변수명으로, 반드시 java.lang.Throwable
클래스의 하위 클래스 타입으로 선언되어야 한다.다중 catch
블록
여러 개의 예외가 발생할 수 있는 경우 다중 catch블록을 사용하여 예외에 따라 적절하게 예외를 처리할 수 있다.
try{
예외 발생 가능이 있는 코드;
}catch(예외 타입1 매개 변수){
예외 타입1의 예외가 발생할 경우 수행될 코드;
}catch(예외 타입n 매개 변수){
예외 타입n의 예외가 발생할 경우 수행될 코드;
}
finally
블록try-catch
블록과 함께 사용 가능finally
블록의 내용은 예외 발생의 유무나 예외 catch 유무와 상관 없이 무조건 수행된다.데이터베이스 연동 로직, 파일입출력 로직을 수행한 후에 반드시 수행되어야할 로직이 있는 경우 사용
try{
예외 발생 가능이 있는 코드;
}catch(예외 타입 매개 변수){
예외 타입의 예외가 발생할 경우 수행될 코드;
}finally{
예외 발생 여부와 무관하게 무조건 수행될 코드;
}
throws
예약어
[modifiers] returnType 메소드명(argType argNmae, ...)[throws exceptionName1, exceptionName2, ...]
// 여러 개의 예외 클래스 이름을 나열할 수 있다.
throws
를 사용하여 예외 처리를 다른 메소드로 전달할 때, 발생된 예외 객체가 RuntimeException
의 자식 클래스인 경우 명시적으로 throws
사용하지 않아도 자동으로 호출된다.❗️호출 부에서 예외를 처리하는 이유
프로그램에서 필요한 예외 객체를 API에서 제공하지 않을 경우 개발자가 직접 예외 클래스를 정의해서 사용해야 한다.
모든 예외 클래스의 최상위 클래스인 java.lang.Exception
클래스를 상속받아 정의한다.
강제로 예외를 발생시켜야 하는 경우
throw
예약어를 사용해 강제적으로 예외를 발생시킨다.try-catch
로 예외 처리
throw new 사용자 정의 예외 클래스 명();
java.lang
패키지java.lang.Object
클래스equals()
methodequals()
메소드는 비교 대상이 되는 두 개의 주소 값을 비교하는 것이 아니라 객체의 내용을 비교할 때 사용equals()
메소드는 기본적으로 객체의 주소값을 비교하는 == 연산자와 동일하게 작동하므로 개발자가 필요에 따라 적절하게 Overriding을 해줘야 한다.toString()
methodSystme.out.println
에서 사용 시 자동으로 호출되기 때문에 호출할 필요 없다.Wrapper 클래스 | 기본 데이터 타입 |
---|---|
Boolean | boolean |
Character | char |
Byte | byte |
Short | short |
Integer | int |
Long | long |
Float | float |
Double | double |
parseInt(String, int)
: 문자열을 주어진 radix의 int형으로 변환toString()
: 현재 객체를 String형으로 변환toString(int i)
:ifmf String형으로 변환char charAt(int index)
: index번째 문자 반환String concat(String str)
: 문자열 결합boolean endsWith(String suffix)
: 특정 문자열로 끝나는지의 여부를 boolean 값으로 returnboolean equals(Object anObject)
: 2개 문자열 값을 비교하여 true, false 반환boolean equalsIgnoreCase(String antherString)
: 대소문자 구분 없이 2개의 문자열을 비교하여 true, false 반환byte[]getBytes()
: 문자열을 byte 배열로 변환int indexOf(int ch)
: ch를 유니코드로 하는 문자의 위치를 반환int indexOf(String str)
: str문자열의 위치 반환int length()
: 문자열 길이 반환String[]split(String regex)
: 지정딘 regex를 중심으로 여러 개의 문자열 배열로 분리boolean startsWith(String prefix)
: 특정 문자열로 시작하는지 비교String substring(int beginIndex)
: 특정 위치부터의 문자열만 반환String substring(int beginIndex, int endIndex)
: beginIndex부터 endIndex까지의 문자열 반환String toLowerCase()
: 소문자로 변환String toUpperCase()
: 대문자로 변환String trim()
: 문자열 양쪽의 공백을 제거String name1 = new String("문자");
String name2 = "문자열";
int capacity()
: 현재 문자열의 총 용량char charAt(int index)
: index위치의 문자 반환StringBuffer delete(int start, int end)
: start에서 end까지의 문자열 중에서 삭제한 문자열을 반환StringBuffer insert(int offset, String str)
: offset위치에 문자열 데이터를 삽입int lastIndexOf(String str)
: str의 최종 인덱스 위치를 반환int lastIndexOf(String str, int fromIndex)
: fromIndex로부터 시작하여 str의 최종 인덱스 위치를 반환int length()
: 문자열 내 문자 개수를 반환StringBuffer replace(int start, int end, String str)
: start에서 end까지의 문자열을 str문자열로 대체하여 반환String substring(int start)
: start위치로부터의 일부 문자열을 반환String substring(int start, int end)
: start에서 end까지 문자열을 반환public class StringBufferTest1{
public static void main(String args[]){
String str = "안녕";
str.concat("하세요");
System.out.println(str);
StringBuffer strbuff = new StringBuffer("안녕");
strbuff.append("하세요");
System.out.println(strbuff);
}
}
//output
//
// 안녕하세요
StringBuffer는 StringBuffer 클래스의 메소드를 사용했을 때 문자열을 직접 조작한다. - 기존의 문자열을 수정한다.