기존에는 stop() 메소드를 활용해서 현재 진행중인 스레드를 종료시켰었나봅니다. 하지만 해당 메소드가 Deprecated 되어 있습니다. 왜 그럴까 생각해보았을땐 대충 공유객체에 대한 자원관리와 갑작스런 스레드 종료에 따른 어플리케이션 불안 정도를 꼽을 수 있었는데요. Thread 클래스에 존재하는 stop 메소드의 주석을 우선 뜯어보았습니다. 이 메소드는 본질적으로 안전하지 않습니다. Thread의 stop 메소드로 스레드를 종료하는 것은 스레드가 가진 모든 자원이 해제됩니다. 예를 들어, 공유객체입니다. 공유객체를 특정 스레드가 점유하여 처리하고 있을 때, 갑작스럽게 종료하게 된다면 해당 공유객체는 미완료처리된 불완전 객체로써 메모리에 남게됩니다. 그로인해 시스템은 의도하지 않은 행동을 취할 수 있..
문제 설명 클래스 TreeNode가 다음과 같이 있을때 class TreeNode { int val; TreeNode left, right; public TreeNode(int x) { this.val = x; } } 다음과 같은 트리노드를 구현한 매개변수로 TreeNode 인스턴스를 받고 다음의 배열로 표현되도록 하시오. 결과 : [[33], [22, 44], [3, 26, 77], [55]] 나의 풀이 public List solution(TreeNode root) { List result = new ArrayList(); if(root == null) return result; Queue queue = new LinkedList(); queue.offer(root); while(!queue.isEm..
public static void main(String[] args) { System.out.println(solution("(){}[]")); //true System.out.println(solution("{(})}){)}{(}{)})(")); //false System.out.println(solution("{([])}")); //true System.out.println(solution("{[}]")); //false } 괄호 (), {}, [] 세가지를 이용하여 괄호가 알맞게 열리고 닫혔는지 판단하는 solution 함수를 작성하시오. 즉, 위 main 메소드의 결과를 만족하는 solution 함수를 작성하시오. 풀이 private static boolean solution(String s) {..
안녕하세요. 오늘은 Arrays.asList() 라는 메소드를 사용하다가 발생한 에러에 대해서 공유하고자 합니다. 먼저 List list = Arrays.asList("A", "B", "C"); 다음과 같이 Arrays.asList로 만든 list 객체가 있었고 추가적으로 "D"라는 문자열이 추가될 수 있는 상황이었습니다. 그리하여 list.add("D"); "D" 문자열을 추가해주었더니 다음과 같은 에러가 발생하였습니다. Request processing failed; nested exception is java.lang.UnsupportedOperationException 왜 발생하는지 알아보기 위해서 Arrays의 asList 메소드를 까봤습니다. 메소드 바로 위에 달린 주석을 참조하니 단번에 눈치..
자바에서 커스텀 어노테이션을 만드는 방법은 다음과 같다. public @interface MyAnnotation { } 사실상 인터페이스 키워드에 @를 붙이면 되는 것인데. 이것을 곧바로 클래스, 필드, 메서드 같은 곳에 붙이면 어노테이션으로써의 껍데기 역할은 할 수 있게 된다. - @MyAnnotation 사용 예) @MyAnnotation public class MyMain{ public static void main(String[] args){ System.out.println("Hello World!"); } } @Retention 어노테이션 - Book 클래스 package org.example; @MyAnnotation public class Book { private static String..
리플렉션은 Class 타입으로 시작합니다. 도큐먼트 : https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html Class (Java Platform SE 8 ) Determines if the specified Class object represents a primitive type. There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types tha docs.oracle.com 위의 ..
이 질문은 오래된 질문이지만 아직까지도 자바개발을 하는 개발자들이 자주 묻는 질문입니다. 여러가지 이유가 있지만 메모리, 동기화, 자료구조에 대한 이해도에 따라 대답이 달라지기도 합니다. 주요 이유를 알아보겠습니다. 1. String Pool에 대한 필요 String Pool은 자바의 힙영역에서 특수한 저장영역입니다. String 객체가 생성되고 만약 이미 기존에 같은 String 객체가 존재한다면 참조값은 새로운 객체가 아닌 기존의 String 객체로 정해지게 됩니다. 다음의 코드는 heap영역에 하나의 String 객체만을 만들게 될 것입니다. String string1 = “abcd”; String string2 = “abcd”; 원리는 아래의 그림과 같습니다. 문자열을 변경할 수 없는 경우, 하나..
멤버변수 - 클래스 변수라고도 하며 메소드에 선언된 것이 아닌 클래스의 필드에 선언된 변수. 로컬변수 - 메소드가 실행될 때만 사용되는 변수. 메소드 내부에 선언되어 있음. 람다식에서 클래스의 멤버변수 사용 - 람다식에서 this는 내부적으로 생성되는 익명객체의 참조가 아닌 람다식을 실행한 객체의 참조이다. - 바깥 객체와 중첩 객체의 참조를 얻어 필드값을 출력하는 예제. @FunctionalInterface public interface MyFunctionalInterface { public void method(); } public class UsingThis { public int outterField = 10; class Inner{ int innerField = 20; //Inner 클래스 멤버..