본문 바로가기
728x90

Language28

apply, with, let, also, run ? apply: 개체를 생성하거나 초기화 할때 주로 사용 val peter = Person().apply { // apply 의 블록 에서는 오직 프로퍼티 만 사용합니다! name = "Peter" age = 18 } with: Non-nullable (Null 이 될수 없는) 수신 객체 이고 결과가 필요하지 않은 경우에만 with 를 사용합니다. val person: Person = getPerson() with(person) { print(name) print(age) } let: 지정된 값이 null 이 아닌 경우에 코드를 실행해야 하는 경우 getNullablePerson()?.let { // null 이 아닐때만 실행됩니다. promote(it) } val driversLicence: Licence.. 2024. 4. 7.
코틀린 Csv file read, file read fun csvReader() { val filePath = "root/file.csv" CSVReaderBuilder(FileReader(filePath)).build().use { reader -> //필요 작업.. } } import java.io.BufferedReader import java.io.File import java.io.FileReader fun main() { val file = File("root") val reader = BufferedReader(FileReader(file, Charsets.UTF_8)) reader.lines().forEach { println(it) } } - 스트림을 사용해도될듯..취향차이.. 2023. 5. 19.
final 키워드를 사용하면 좋은 점. 변경 불가능성: final 변수는 값을 한번 할당하면 변경이 불가능해집니다. 이로 인해 의도치 않은 값의 변경이나 버그를 방지할 수 있습니다. 안전한 다중 스레드 환경: final 변수는 다중 스레드 환경에서 안전합니다. final 변수는 한 번 초기화되면 이후에 값이 변경될 수 없으므로, 다른 스레드에서 값을 변경할 가능성이 없습니다. 상수 값 정의: final 변수는 상수 값의 정의에 사용될 수 있습니다. 예를 들어, Math.PI와 같은 상수 값은 final로 선언됩니다. 성능 향상: final 변수는 컴파일러에게 추가적인 정보를 제공하므로, 컴파일러가 최적화 작업을 더 잘 수행할 수 있습니다. 또한 final 변수는 컴파일 타임 상수 폴딩(constant folding)을 가능하게 하고, 해당 변.. 2023. 2. 22.
람다, 익명클래스는 왜 final 또는 effectively final 에만 접근 가능할까? 람다식은 메서드 내부에서 익명으로 생성되는 객체이므로, 해당 객체가 생성될 때 외부에서 참조하는 변수들은 반드시 final 또는 사실상 final과 동등한 효과를 가져야 한다. 람다식이 정의된 블록의 외부 변수를 캡처하는 방식에 기인하는데, 람다식에서 사용하는 외부 변수는 내부적으로 해당 변수를 참조하는 final 필드를 생성하게 되며, 이렇게 final 필드로 새엉된 참조 변수를 통해서만 해당 변수에 접근할 수 있다. 즉 람다는 내부에서 참조하는 변수가 final로 선언된 경우에만 참조할 수 있다. 람다식이 실행되는 시점에 해당 변수의 값이 이미 정해져 있기 때문에 람다식 내부에서 참조하는 변수가 변경될 가능성이 있으면 해당 변수를 final 로 선언하면 안되며, 다른 방법으로 값을 전달해야 하는데, .. 2023. 2. 22.
자바 클로저에 대한 짧은.. 클로저는 다른 함수의 스코프에 있는 변수를 참조하고 저장할 수 있는 함수를 말한다. 자바에서는 함수를 일급 객체로 다룰 수 있게 됩니다. import java.util.function.Supplier; public class ClosureExample { public static void main(String[] args) { // 클로저를 이용한 간단한 덧셈 함수 예시 int a = 10; int b = 20; Supplier adder = () -> a + b; System.out.println("Result: " + adder.get()); // Result: 30 // 클로저를 이용해 값을 변경하는 예시 int c = 5; Runnable updater = () -> { c++; // 클로저가 참.. 2023. 2. 22.
왜 private인 필드가 변하지 않도록 하기 위해 final 키워드를 선언해야 하는가?(by.리플렉션) 접근자 메서드가 없는 final 지시자로 선언한 클래스가 있고 모든 필드가 private 라면 클래스가 변하지 않는다고 생각하는 경향이 있다. 하지만 그렇지 않다. 리플렉션 API 를 이용해서 필드가 보이는지와 상관없이 모든 필드에 접근하고 변경할 수 있다. 또한 final 지시자는 해당 필드가 절대 수정되지 못하도록 JVM 에게 알려준다. 덕분에 외부에서 접근할 수 없게 제대로 설정된 것처럼 보이지만 실제로는 외부에서 접근할 수 있는 방법이 몇 가지 있다. 예를 들어 스프링의 IoC 컨테이너 같은 경우 @Autowired 어노테이션이 선언된 privatate 필드는 컨테이너가 실행 도중 초기화될 때 설정될 수 있다. 아래코드는 리플렉션을 이용해 필드를 변경한 코드이다. @Test void mutateB.. 2023. 2. 14.
메서드 변수에 사용하는 static 키워드 정적 메서드와 정적 변수는 클래스 내부에 정의하지만 인스턴스에 속하지 않는다. 이는 모든 인스턴스에 공통으로 적용되는 사항이므로 대게 특정 인스턴스보다는 클래스 이름을 통해 정적 메서드와 정적 변수에 접근한다. @Test void staticVariableAccess() { assertThat(7).isEqualTo(ExampleClass.EXAMPLE_VALUE); ExampleClass c1 = new ExampleClass(); ExampleClass c2 = new ExampleClass(); c1.EXAMPLE_VALUE = 13; // 가능은 하지만 추천하지 않음. assertThat(13).isEqualTo(ExampleClass.EXAMPLE_VALUE); assertThat(c2.EXAM.. 2023. 2. 14.
final 키워드는 객체 참조에 어떤 영향을 미치는가? 객체를 선언하는 final 키워드는 원시 타입에 선언하는 final 키워드와 동일한 역할을 한다. 변수 정의에서 지정된 값처럼 일단 할당이 되고 나면 메모리 위치가 변경되지 않는다. 원시 타입과 객체의 변수 정의와 메모리 할당은 전혀 다른 형태로 이루어진다. 객체 참조는 변경할 수 없어도 객체 내부의 값들은 개별 값들이 final 이 아니라면 변경할 수 있다. @Test void finalReferenceChanges() { final int i = 42; //i = 43 error final List list = new ArrayList(); //list = new ArrayList(); error assertThat(0).isEqualTo(list.size()); list.add("adding a n.. 2023. 2. 14.
Comparable 과 Comparator 인터페이스의 차이는 무엇인가? 두 인터페이스 모두 public 접근 변경자로 선언하기 때문에 모든 용도로 자료를 담을 수 있다. Comparable 인터페이스는 자연스러운 순서로 정렬할 때 사용하고, Comparator 는 원하는 대로 정렬 순서를 지정하고 싶은 곳에 사용한다. 배열을 정렬할 때는 일반적으로 Array나 Collectio 클래스에 내장된 라이브러리를 이용한다. Array와 Collection 클래스는 몇 가지 오버로딩된 정렬 메서드가 있다.크게 배열을 매개변수로 받는 메서드와 배열을 Comparator 객체를 매개변수로 받는 서드의 두 가지로 분류된다. 그리고 각각의 원시타입 과 참조타입에 관한 객체를 오버로드 한다. Comparator 객체가 없는 구현체는 타입을 자연스런 순서로 정렬한다. @Test void sor.. 2023. 2. 14.
728x90