Back-end

Java 메모장

elysia365 2021. 5. 16.

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

댓글