자바에서 API란?
API (Application Programming Interface )
애플리케이션에 선언되어 있는 클래스와 메소드에 대한 상세한 설명이 포함된 문서
- 문서를 자동으로 생성하는 명령어 : javadoc
- API 왼쪽 위에 제공하는 창 : 패키지 목록
- API 왼쪽 아래 제공하는 창 : 클래스 목록
- API 우측 본문 : 상세설명
- Deprecatied : 더이상 사용하지 않는 레거시
BigDecimal
숫자를 정밀하게 저장,표현하는 클래스
- 생성자 : 16개
- abs() : 절대값 표현
- subtract : 빼기 구현
- dvide : 나눗셈
모든 자바 클래스의 부모 클래스는 Object다( java.lang.Object )
모든 클래스는 아무 상속을 받지 않았을 때 자동으로 Object 클래스를 자동 상속 받게 되어있다.
Object 클래스를 상속받는 이유는?
- Object 클래스의 메소드를 통해 클래스의 기본적인 행동을 정의할 수 있다.
Object 클래스에서 제공하는 메소드의 종류는?
- 객체를 처리하기 위한 메소드
- 쓰레드를 위한 메소드
예를 들어 Object의 toString()을 오버라이딩을 활용할 수 있는데, 해당 객체의 변수명만 호출시 toString()을 자동으로 불러오는 기능이 있다.
class ObjectTestDTO{
private String name;
private Integer age;
private String address;
//getter setter 생략
public String toString(){
return "name = " + name + " age = " + age + " address = " + address;
}
}
class Test{
public static void main(String[] args){
ObjectTestDTO dto = new ObjectTestDTO();
dto.setName("홍길동");
dto.setAge(24);
dto.setAddress("서울특별시 영등포구 ....");
System.out.println(dto);
}
}
/*
name = 홍길동 age = 24 address = 서울특별시 영등포구 ....
*/
가비지 컬렉터란?
자바로 개발할 때 객체를 만들어져 쓰인 후 더 이상 필요 없어졌을 때 정리해주는 역할을 하는 기능을 한다
인터페이스와 추상 클래스, Enum 클래스
Interface란
인터페이스는 개발을 하기 위한 [ 분석 → 설계 → 개발 → 릴리즈 ] 단계에서 설계 단계에 해당한다.
설계 단계는 다음과 같다.
분석 단계에서 만든 대략적인 그림을 프로그램으로 만들 수 있도록 설계하는 작업을 수행, 어떤 메소드를 만들 것인지, 데이터는 어떻게 저장할지 등등의 세부적인 것들을 정리한다.
public interface AnalysisInterface{
public boolean YesOrYes(AnalysisDTO dto);
public String getNameAndSettingDTO(AnalysisDTO dto);
public int updateMember(String name);
}
인터페이스의 사용
public class AnalysisInterfaceImpl implements AnalysisInterface{
@Override
public boolean YesOrYes(AnalysisDTO dto){
return false;
}
@Override
public String getNameAndSettingDTO(AnalysisDTO dto){
return "";
}
@Override
public int updateMember(String name){
return 0;
}
}
- 인터페이스에는 리턴값과 매개변수만이 존재할 수 있고 구현되기 전까지 몸통이 존재할 수 없다
- 인터페이스는 extends(상속)과 다르게 2개, 3개, 4개 ... 100개도 구현이 가능하다
- 인터페이스는 implements를 통해 구현한다
- 인터페이스는 선언한 모든 메소드를 구현해야 한다
- 클래스에 붙는 Impl는 인터페이스의 구현체라는 뜻이다
Abstract란?
추상화를 하되 몸통이 있는 메소드도 존재한다
public abstract class AbstractClass{
public abstract boolean YesOrYes(AbstractDTO dto);
public abstract String getNameAndSettingDTO(AbstractDTO dto);
public int updateMember(String name){
int result = 0;
if(name.equals("성공")){
result = 1;
}
return result;
}
}
- abstract 클래스는 클래스 선언시 abstract가 들어가야 한다.
- abstract로 선언된 메소드가 0개 이상 존재 해야 한다.
- abstract로 선언된 메소드가 하나라도 있으면 class에 abstract를 선언해야 한다
- abstract는 클래스이기 때문에 implements가 아닌 extends로 상속 받을 수 있다.
즉 하나의 클래스만이 상속 가능하다
final 이란?
사전적 의미로 마지막 이라는 뜻이 있다. final은 클래스, 메소드, 변수에 선언할 수 있다.
- 클래스의 final이 클래스는 상속이 불가능하다
public final class ParentClass{ public String printLog(){ return ""; } } public class ChildClass extend ParentClass{ // 불가능! }
- 메소드의 final이 메소드는 오버라이딩이 불가능하다
public class ParentClass{ public String printLog(){ return ""; } } public class ChildClass extend ParentClass{ public String pringLog(){ // 불가능! return ""; } }
- 변수의 final변수의 final은
- 초기화 값이 지정되어 있어야 컴파일이 가능하다.
- 초기화된 값을 변경이 불가능하다
- 왜냐? 해당 변수를 초기화를 선언하지 않고 여러 위치에서 초기화를 시킨다면 final의 목적에 위반된다
public class VariableClass { final String str; // 불가능! final int number = 1; public void testMethod(){ number = 2; // 불가능! } }
- 객체의 final위의 final과 마찬가지로 새로운 객체로 변경할 수 없다.
- 다만 객체가 fina 인 것이지 내부에 있는 데이터는 final이 아니기 때문에 데이터 수정이 가능하다
public class Test{ private int num; private String name; } public class TestClass{ public void testMethod(){ final Test test = new Test(); test = new Test(); // 불가능! test.num = 1; test.name = "test"; } }
Enum Class
상수의 집합이라는 것을 명시적으로 나타내는 클래스다.
public enum EnumClass {
FirstNumber(1,"테스트1"),
SecondNumber(2,"테스트2"),
ThirdNumber(3,"테스트3");
private final int amount;
private final String name;
EnumClass(int amount, String name){
this.amount = amount;
this.name = name;
}
public int getAmount(){
return amount;
}
public String getName(){
return name;
}
}
public static void main(String[] args) {
System.out.println(EnumClass.FirstNumber);
System.out.println(EnumClass.SecondNumber);
System.out.println(EnumClass.FirstNumber.getAmount());
System.out.println(EnumClass.FirstNumber.getName());
System.out.println(Arrays.toString(EnumClass.values()));
}
/*
FirstNumber
SecondNumber
1
테스트1
[FirstNumber, SecondNumber, ThirdNumber]
*/
위와 같이 객체의 생성 없이 사용할 수 있다.
예외 ( Exception )
예외란 정해져 있는 규칙을 벗어난 사건, 행동을 뜻한다.
예를 들어 배열을 5개의 공간만 생성했는데, 6번째 공간을 참조하려 한다면? 예외가 발생하는 것이다.
예외 처리 기본 문법 try{ }catch(Exception e){ }
public class Test{
public static void main(String[] args){
try{
// 내용 작성
}catch(Exception e){ // 발생 예상되는 예외 종류 작성
// 예외 발생시 처리방법
}finally{
// 예외가 발생해도 발생하지 않아도 반드시 실행되는 구간
}
}
}
- try블록에서 에러가 발생할 경우 에러가 발생한 해당 구문에서 바로 catch블록으로 넘어가게 된다.
- try 다음에 오는 catch 블록은 1개 이상 올 수 있다
- 먼저 선언한 catch 블록의 예외 클래스가 다음에 선언한 catch 블록의 부모에 속하면, 자식에 속하는 catch 블록은 절대 실행될 일이 없으므로 컴파일 되지 않는다
- 하나의 try 블록에서 예외가 발생하면 그 예외와 관련이 있는 catch 블록을 찾아서 실행한다.
예외의 종류는 3가지다
- checked exception
- 아래 Error와 Runtime Exception을 제외한 모든 예외를 의미한다
- error
- error는 자바 프로그램 밖에서 발행한 예외를 말한다.
- runtime exception 혹은 unchecked exception
- 컴파일 시에는 예외 사항이 없었지만 프로그램을 실행시 발생한 예외를 의미한다.
Throwable 클래스
모든 예외의 공통 부모 클래스는 Object와 Throwable 클래스다
Throwable 클래스에서 오버라이딩한 메소드중 자주 사용하는 메소드 3가지
- getMaessage()
- 예외 메시지를 string 형태로 제공 받는다. 예외가 출력 되었을 때 어떤 예외가 발생 되었는지를 확인할 때 매우 유용하다.
- toString()
- 예외 메시지를 sTring 형태로 제공 받는다. getMessage() 메소드보다는 약간 더 자세하게, 예외 클래스 이름도 같이 제공한다.
- printStackTrace()
- 가장 첫줄에는 예외 메시지를 출력하고, 두번째 줄부터는 예외가 발생하게 된 메소드들의 호출 관계를 출력해준다.
public static void main(String[] args) {
int[] array = new int [5];
try{
System.out.println(array[5]);
} catch(Exception e){
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
}
/*
Index 5 out of bounds for length 5
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at com.company.Main.main(Main.java:36)
*/
throw로 예외 발생 시키고 throws로 예외 받기
public static void main(String[] args) throws Exception {
throw new Exception("test");
}
/*
Exception in thread "main" java.lang.Exception: test
at com.company.Main.main(Main.java:34)
*/
- throws 예약어를 선언시 호출한 메소드로 예외가 전달된다.
String 클래스
public final class String extends Object
implements Serializable, Comparable<String>, CharSequence
- String class는 final로 선언되어 있어 불변 객체이다.
- Serializable을 통해 저장하거나 다른 서버에 전송이 가능한 상태가 된다.
- Comparable은 객체의 위치를 비교할 수 있다.
- CharSequencesms 문자열을 다루기 위한 클래스라는 것을 명시적으로 나타낸다
주로 사용하는 생성자
- String(byte[] bytes)
- String(byte[] bytes, String charsetName)
우리는 한글을 사용하기 때문에 UTF-8 캐릭터 셋을 사용하는데, 문자를 주고 받을때 깨지는 것을 방지하고자 byte[]를 가져올 때 getByte("UTF-8")와 같이 캐릭터셋을 지정한다.
String은 동일한 값을 갖는 문자열이 작성 되었을 경우 자바에서 Constant Pool에 의해 같은 이미 만들어져 있는 객체를 사용하기 때문에 동일한 참조값을 바라보고 있다. 이를 다르게6 사용하고자 한다면 new String("")으로 새로운 인스턴스를 생성해줘야 한다.
String 메소드
- 문자열의 길이를 확인하는 메소드 ( int 반환 )
public void checkString(){
String text = "test String";
System.out.println(text.length());
}
- 문자열이 비어 있는지 확인하는 메소드 ( boolean 반환 )
public void emptyString(){
String text = "test String";
System.out.println(text.isEmpty());
}
- 문자열이 같은지 비교하는 메소드
equals : 문자를 비교한다
compareTo : 객체의 대소를 비교하여 차이만큼의 수를 나타낸다
- 특정 조건에 맞는 문자열이 있는지 확인하는 메소드
startsWith : 매개 변수로 넘겨준 값으로 시작하는지 확인
indexOf : 해당하는 문자열이 있는지 확인하고 위치의 index를 알려준다
endWith : 매개 변수로 넘겨준 값으로 끝나는지 확인
contains : 해당 문자열이 존재하는지 확인
matches : 정규 표현식상 맞는지 확인
등등
immutable(불변)한 String의 단점을 보완하는 StringBuffer와 StringBuilder
불변한다는 것은 더이상 변하지 않는 값이라는 뜻이다. 즉, String 객체는 "객체" + "더하기" 를 해도 더해진 값을 변수에 대입하는 것이 아니라 새로운 객체를 만드는 것이다.
이를 보완하는 새로운 객체를 생성하지 않는 클래스 2가지
StringBuffer : Thread safe하다
StringBuilder : Thread safe하지 않다, 속도가 더 빠르다
언제 사용하나? 문자열을 더해야 하는 작업이 많을 경우 사용해야 한다.
'Programming > Backend' 카테고리의 다른 글
자바 기초 다지기 - 6 (Thread, Syncronized, Serializable, IO, NIO) (0) | 2021.09.13 |
---|---|
자바 기초 다지기 - 5 ( Generic, Collection, Map ) (0) | 2021.09.06 |
자바 기초 다지기 - 4 (내부 클래스, 어노테이션, 자바) (0) | 2021.08.29 |
자바 기초 다지기 - 2 (조건문, 반복문, 배열, 참조자료형, DTO, 상속, 오버라이딩, 오버로딩, 다형성) (0) | 2021.08.16 |
자바 기초 다지기 - 1 (클래스, 메소드, 변수, 컴파일, 연산자) (0) | 2021.08.16 |