아무거나 개발공부/JAVA 기초다지기 12

람다에서 지역변수 값을 변경하지 못하는 이유 Variable used in lambda expression should be final or effectively final

개요 JAVA에서 람다식을 사용하다보면, 가끔 인텔리제이에서 Variable used in lambda expression should be final or effectively final 해당 내용의 컴파일 에러가 나온다. 대강 구글링하여 지역변수를 사용하면 안된다는 건 알고있었는데 정확한 이유는 알지 못하고, 나중에 리서치하고 정리해야지 하고 넘어갔다. 람다와 지역변수, 전역변수 더 나아가 멀티쓰레드, 메모리할당 구조까지 폭넓은 범위를 다루고 있었고, 이에 대해 정리하였다. 쓰레드 메모리 할당 구조 위 그림은 멀티 쓰레드의 메모리 할당 구조이다. CODE, DATA(Method Area), HEAP 부분은 공유하고, Stack 영역만 각각 사용하는 걸 볼 수 있다. JAVA에서 지역변수는 Stack ..

JAVA - 리플렉션의 모든 것

아래 코드는 스프링을 사용한 BookService 코드이다. @Service public class BookService { @Autowired BookRepository bookRepository; } 질문 bookRepository 인스턴스는 어떻게 null이 아닌걸까? 스프링은 어떻게 BookService 인스턴스에 BookRepository 인스턴스를 넣어준 것일까? 리플렉션 API - 클래스 정보 조회 리플렉션의 시작은 Class 이다. Class에 접근하는 방법 모든 클래스를 로딩 한 다음 Class의 인스턴스가 생긴다. “타입.class”로 접근할 수 있다. 모든 인스턴스는 getClass() 메소드를 가지고 있다. “인스턴스.getClass()”로 접근할 수 있다. 클래스를 문자열로 읽어오..

JVM & 클래스 로더란?

JVM (Java Virtual Machine) 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다. JRE (Java Runtime Environment): JVM + 라이브러리 자바 애플리케이션을 실행할 수 있도록 구성된 배포판. JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다. 개발 관련 도구는 포함하지 않는다. (그건 JDK에서 제공) JDK (Java Development Kit): JRE + 개발 툴 JRE + 개발에 필요할 툴 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적. 오라클은 자바 11부터는 JDK만 제공하며 JRE를 따로 제공하지 않는다...

직렬화 매개변수로 ArrayList는 되고, List는 안되는 이유

개요 프로젝트를 진행하면서, 직렬화 된 객체를 매개변수로 받는 메서드를 만들었다. public void putData(String key, Serializable data) { data.put(key, data); } 해당 메서드를 사용하는데, List 타입으로 직렬화 변수를 넣으면 컴파일 에러가 발생하였고, ArrayList 타입을 넣었을 때는 정상적으로 동작한다. // 정상동작 ArrayList newData = new ArrayList(); newData.putData(key, newData); // Type 컴파일 에러 발생 List newData = new ArrayList(); newData.putData(key, newData); 선언은 다르지만 어쨋든 new ArrayList()을 할당 했..

JAVA - UnsupportedOperationException 발생 해결

List로 변환 가능한 메소드 자바에서는 list로 변환하는 3가지 메소드가 있다. Arrays.asList() Collection.singletonList() List.of() 3가지에 대한 자세한 설명은 아래 링크에 있다. https://code-killer.tistory.com/148 이 3가지 메소드의 가장 큰 특징 중 하나는 List의 길이를 바꿀 수 없다는 점이다. 즉 List의 메소드 중 길이를 바꾸는 add , remove 등의 기능을 사용할 수 없다. 발생 상황 List cardList; List tempCardList = new ArrayList(); .... 중략 (cardList에 Card가 add) ..... //Collection.singletonList()을 활용하여 2차원 L..

Arrays.asList() vs Collection.singletonList() vs List.of()

사용법 3개의 메서드 모두 배열을 List로 변환하는 기능을 한다. 예시를 보면 바로 이해가 갈 것이다. //List.of String [] temp = {"a","b","c","d"}; List aslist = Arrays.asList(temp); //Collection.singletonList String [] temp2 = {"a"}; List singletonList = collection.singletonList(temp2); //List.of 메서드 String [] temp3 = {"a","b","c","d"}; List listOf = List.of(temp3) 위와 같이 배열을 List 타입으로 변환해준다. 위 예제에서는 String 타입 List 인데 다른 타입( ex) class, i..

20년차 개발자의 실무 개발 노하우를 담은 JAVA 기초 - 내 기준 정리

개요 회사에서 외부강의를 지원하는 컨텐츠가 7개월전인가 생겼는데 그 때 '만만해보이는거 간단히 들어볼까'하고 신청했던 강의이다. 결론부터 말하자면 7장 전까지는 JAVA 기초 뿐만 아니라 통상적인 컴퓨터 언어라면 알아야 하는 내용들을 다루고, 그 이후부터는 JAVA의 특성을 다룬다. 그래서 7장 이후에 내가 몰랐던 내용이나, 아차차 까먹었다 하는 내용들만 간단히 정리 해놨다. 기승전결이 없는 나만 볼 수 있는 정리이다. Section 7 메서드 staic block → static method → static init 순서 자바 변수 메모리 할당 부분 좀더 알아보기 Section 8 상속 모든 클래스는 초기화 전에 상위클래스의 생성자를 호출한다. Section 9 다형성 & 추상화 instanceof O..

java에서 모니터 사용하기 - synchronized

세마포어는 실제로 매우 오래된 동기화 도구이다. 현재에는 모니터(monitor)라는 동기화 도구를 주로 사용하며, 이는 좀 더 고수준의 동기화 기능을 제공한다. QuickSort 알고리즘으로 유명한 C. A. R. Hoare(호어)의 논문에서 처음 등장한 개념이다. 하나의 객체마다 하나의 모니터를 결합할 수 있으며, 모니터와 결합된 객체는 잠금(lock) 기능을 가지고 있어 하나의 쓰레드만 접근 가능한다. 모니터 구조 ![[Pasted image 20221107200903.png]] 위는 모니터 구조를 나타낸 그림이다. 모니터는 공유 자원 + 공유 자원 접근함수로 이루어져 있고, 2개의 큐를 가지고 있다. 각각 mutual exclusion(상호배타) queue, conditional synchroniz..

JAVA 기초다지기 (3) - Class , Object, Instance 완벽 이해

클래스, 오브젝트, 인스턴스는 워낙 범용적으로 많이 쓰이고 있다. 여기서는 자바에서의 클래스, 오브젝트, 인스턴스의 관계와 의미에 대해서 정리하였다. 클래스와 객체(Object) 클래스로 모델링한 객체를 정의한다. 객체를 생성할 수 있는 틀을 제공해 주는 소스코드 객체는 클래스의 인스턴스이다. 클래스와 객체, 인스턴스 용어 구분과 인스턴스화 클래스(Class) : 붕어빵 틀 = 하나의 붕어빵 틀로 수많은 붕어빵 객체를 만들 수 있다. 객체(Object) : 붕어빵(들), 객체는 인스턴스를 포함하는 일반적인 의미 인스턴스(Instance) : 각각의 붕어빵(인스턴스는 클래스를 통해 생성된 객체의 한 예이다. 인스턴스화(Instantiate) : 붕어빵을 굽다(클래스로부터 인스턴스를 생성하는 것) 인스턴스화..

JAVA 기초다지기 (2) - JAVA 프로그램

Main() method Java 어플리케이션의 시작점으로 main() 메소드가 포함된 클래스가 반드시 존재해야한다. RunTime에 main()메소드가 존재하지 않는 경우 아래와 같은 오류 발생 : Exception in thread "main" java.lang.NoSuchMethodError.main Command-Line arguments : main 메소드의 파라미터를 통해 애플리케이션 진입시에 값을 전달 할 수 있다. 이 기능을 활용해서 애플리케이션 구동시 초기 설정 환경 변수등의 값으로 활용할 수 있다. public static void main(String[] args) Compile & Running compile : javac 명령어를 이용하여 java 소스를 Compile gkaus ..

728x90