1. 제네릭(Generic)
- 클래스 내부에서 사용하는 데이터의 타입(Type)을 클래스의 인스턴스를 생성할 때 결정하는 것
- 객체의 타입을 컴파일 시점에 체크하기 때문에 타입 안정성을 높이고 형 변환의 번거로움을 줄일 수 있다.
- 의도하지 않은 타입의 객체 저장을 막을 수 있고, 객체를 참조할 때 명시적으로 형 변환을 해줄 필요가 없다.
- 제네릭과 관련된 코드는 대부분 컬렉션과 관련된 코드이다.
- Java5 에 도입되었다.
2. Thread
- 프로세스 내에서 실행되는 독립적인 작업 단위
- 쓰레드의 생성방법
1) Thread 를 extend 한 서브클래스를 만들고, run 메서드를 오버라이드
2) Runnable 인터페이스를 구현하여 run 메서드를 오버라이드한 뒤, 해당 객체를 Thread 생성자의 인자로 넣기
public class ThreadBasicExample {
public static void main(String[] args) {
// 1. Thread extends
Thread t1 = new MyThread();
t1.start();
// 2. Runnable implements
Runnable threadJob = new MyRunnable();
Thread t2 = new Thread(threadJob);
t2.start();
}
}
class MyThread extends Thread{
public void run() {
System.out.println("Thread start : " + Thread.currentThread().getName());
for(int i=0; i<100; i++) {
System.out.println(">> Thread processing " + i + "," + Thread.currentThread().getName());
}
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Thread start : " + Thread.currentThread().getName());
for(int i=0; i<100; i++) {
System.out.println(">> Thread processing " + i + "," + Thread.currentThread().getName());
}
}
}
3) 익명함수와 람다식으로 스레드 실행하기
public class BasicSynchronization {
private String mMessage;
public static void main(String[] args) {
// TODO Auto-generated method stub
BasicSynchronization temp = new BasicSynchronization();
System.out.println("Test start!");
new Thread(()->{
for(int i=0; i<1000; i++) {
temp.callMe("Thread1");
}
}).start();
new Thread(()->{
for(int i=0; i<1000; i++) {
temp.callMe("Thread2");
}
}).start();
}
// public synchronized void callMe(String whoCallMe) {
public void callMe(String whoCallMe) {
mMessage = whoCallMe;
try {
long sleep = (long)(Math.random() * 100);
//System.out.println(sleep);
//System.out.println("Thread Sleep before");
Thread.sleep(sleep);
//System.out.println("Thread Sleep after");
}catch(InterruptedException e) {
e.printStackTrace();
}
if(!mMessage.equals(whoCallMe)) {
System.out.println(whoCallMe + " | " + mMessage);
}
}
}
3-1. Exception
- 실행 순서는 try 블록 실행중에 예외를 만나면 catch 블록으로 이동한 뒤 finally 블락으로 이동한다.
public class ExceptionExample {
public static void main(String[] args) {
List list = null;
try {
list.stream().forEach(s->System.out.println(s));
}catch(NullPointerException e) {
System.out.println("Null point exception : " + e.getMessage());
}catch(Exception e) {
System.out.println("Exception : " + e.getMessage());
}
// catch(InterruptedException e) {
// System.out.println("InterruptedException : " + e.getMessage());
// 컴파일 에러
finally {
System.out.println("Finall");
}
}
}
3-2. Try-with-resources 로 자원 쉽게 해제하기
- Java7 부터는 자원을 쉽게 해제 할 수 있게 되었다.
- 코드의 실행 위치가 try(...) 블록을 벗어나면 try(...) 안에서 선언된 객체의 close() 메소드들을 호출해준다.
- 그래서 finally 에서 close() 를 명시적으로 호출해줄 필요가 없다.
- try-with-resource 에서 자동으로 close 가 호출되는 것은 AutoCloseable 을 구현한 객체에만 해당된다.
public static void main(String[] args) {
Path path = Paths.get("src/com/jwcoding/exception/text.txt");
try {
BufferedReader br = new BufferedReader(new FileReader(path.toString()));
String line = null;
try {
while((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// try-with resource
try (BufferedReader br2 = new BufferedReader(new FileReader(path.toString()));){
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
4. 접근제한자
- 객체의 멤버 중에 외부에 공개되면 안되는 것들이 있을 수 있는데, 이러한 경우에 사용하는 것이 접근제한자이다.
1) public : 모든 접근을 허용
2) protected : 같은 패키지에 있는 객체와 상속관계의 객체들만 허용
3) default : 같은 패키지에 있는 객체들만 허용
4) private : 현재 겍체 내에서만 허용
5. final
- 더이상 변경이 불가능하게 설정하는 키워드
- final 멤버 변수, 지역 변수 : 상수 (한번 초기화되면 변경 불가)
- final 메소드 : 오버라이드 할 수 없는 메소드
- final 클래스 : 상속을 허용하지 않는 클래스
6. static
- 클래스 변수, 메소드로써 인스턴스를 생성 이전에 프로그램이 처음 시작될 때 메소드 메모리 영역에 생성됨
7. ArrayList와 LinkedList
1) ArrayList 특징
- 순차적인 인덱스 구조로 저장하기 때문에 삽입과 삭제 나머지 요소들을 이동해야하는 연산이 발생한다.
- 인덱스 구조로 요소를 관리하기 때문에 랜덤 엑세스가 가능하며 속도가 빠르다. O(1)
2) LinkedList 특징
- 요소들을 불연속적으로 저장하며, 인접한 요소 간의 주소값으로 연결되어있기 때문에 삽입과 삭제가 빠르다.
- 랜덤 엑세스가 불가능하고, 시퀀셜 엑세스만 가능하여 검색 성능이 떨어진다. O(N)
8. JUnit
- Java의 단위 테스트 도구이다. 테스팅 결과를 단순히 문서로 남기는 것이 아니라 Test Class를 그대로 남김으로써 추후 개발자에게 테스트 방법 및 클래스의 History를 넘겨줄 수 있다.
- 어노테이션
1) @Before : 테스트 클래스 안의 메소드들이 테스트 전에 실행할 코드를 정의할 수 있다.
2) @Test : 해당 메소드를 테스트 대상으로 지정할 수 있다.
3) @After : 테스트 클래스 안의 메소드들이 테스트 후 실행할 코드를 정의할 수 있다.
9. 오버로딩과 오버라이딩
- 오버로딩과 오버라이딩 모두 다형성을 지원하기 위한 목적이다.
1) 오버로딩(Overloading)
- 같은 이름의 메소드 여러개를 매개변수의 유형과 개수가 다르도록 하는 방법
2) 오버라이딩(Overriding)
- 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용할 수 있게 하는 방법
10. this와 this()
1) this
- 현재 클래스의 인스턴스를 의미
2) this()
- 현재 클래스에 정의된 생성자를 호출
11. super와 super()
1) super
- 자식 클래스에서 상속받은 부모 클래스의 멤버변수를 참조할 때 사용
2) super()
- 자식 클래스가 자신을 생성할 때 부모 클래스의 생성자를 불러 초기화할 때 사용
- 기본적으로 자식 클래스의 생성자에 super() 는 생략되어있다.
12. MD5
- MD5(Message-Digest algorithm 5) 는 128비트 암호화 해시 함수로 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용되는 암호화의 한 종류
- 비밀번호를 생성하는데에는 안전하지 않고, 이제는 SHA-256 사용을 권장하고 있다.
'Back-end' 카테고리의 다른 글
| Oracle SQL을 MySQL로 전환하기 (0) | 2024.05.21 |
|---|---|
| Snowflake ID Generator (0) | 2023.04.16 |
| Javascript 에서 9천조 이상의 숫자를 다룰때 고민할 부분 (0) | 2023.04.13 |
| 스트림 (Stream) - JAVA 8 (0) | 2021.05.15 |
| JAVA... (0) | 2021.04.21 |
댓글