Java/Grammer

    Optional의 옳바른 사용법

    지난주부터 Optional에 대해 어떻게 설명하면 좋을까 고민을 많이 해보고 이리저리 찾아도 봤습니다. 처음에는 단순히 null처리를 쉽게할 수 있는 람다식 문법 중 하나겠구나 생각하면서 써왔습니다. 근데 주의사항이 무려 20가지가 넘는 글도 보이고해서 "이거...그냥 단순 null처리가 아닌데?"라는 생각에 바싹 조사를 했습니다. 오늘은 Optional 사용 시 주의해야할 점을 핵심만 요약해 알아보겠습니다. 1. Optional은 함수의 반환 타입에서 사용하도록 설계되었다. ID에 따라 User 객체를 가져오는 메서드를 예로 들겠습니다. 이때 자동차 저장소에는 ID에 해당하는 Car 객체가 없을수도 있습니다. Car car = CarRepository.findById(); if(car != null) ..

    Stream API 정리

    오늘은 간단하게 기초적인 예제와 함께 Stream API를 정리해보도록 하겠습니다. 사실 개념 설명이라기보단 단순 정리에 가까우니 참고용으로 봐주시길 바랍니다. 스트림 생성 //배열 스트림 생성 String[] arr = {"a", "b", "c"}; Stream arrStream = Stream.of(arr); //리스트 스트림 생성 List list = Arrays.asList(arr); Stream listStream = list.stream(); 스트림을 만드는 방법은 다양하고 배열이나 컬렉션이냐에 따라 생성하는 방법도 다릅니다. 여기선 가장 많이 사용되는 방법으로 스트림을 생성해보았습니다. 스트림의 중간 연산 ⦁ 자르기 (skip, limip) String[] ex1 = {"a", "b", "c..

    입출력 스트림 (2) - File I/O

    2022.05.22 - [Java/Grammer] - 입출력 스트림 (1) - System.out.println와 I/O 이전 시간에는 System.out.println을 통해 자바 입출력 스트림에 대한 개념들에 대해 알아보았습니다. 이전에 배운 내용을 토대로 이미지나 텍스트 데이터를 다루어 파일에 입출력하는 File I/O에 대해 알아보겠습니다. 오늘 우리의 목표는 원하는 디렉토리 위에서 여러 종류의 데이터를 다루는 연습을 하는 겁니다. 파일 객체 다루기 파일을 만들기 전 우리는 디렉토리(폴더)를 만들어야 합니다. 자바에선 File Class를 통해 파일을 다룰 수 있으며 해당 객체는 해당 경로에 실제 파일이 없더라도 에러가 나지 않습니다. 그렇다면 파일 객체는 무엇을 할수 있을까요? public st..

    입출력 스트림 (1) - System.out.println와 I/O

    여러분은 System.out.println에 대해서 얼마나 알고계신가요? 오늘 소개드릴 내용은 입출력과 파일에 대한 내용입니다. 궁극적으로는 파일 입출력을 다룰려 했지만 그 전에 입출력에 대한 이해를 돕기위해 우리가 매일 보는 콘솔 입출력을 예시로 입출력 스트림에 대해서도 설명드릴 예정입니다. System.in과 System.out System 클래스는 시스템에 대한 여러가지 속성과 설정을 할수 있는 클래스입니다. 해당 클래스 안에 미리 정의된 정적 멤버변수가 존재하는데 이들이 바로 System.in과 System.out입니다. 이들을 표준 입출력 객체라하고 이들을 사용해서 콘솔에 입출력하는거지요. 그들이 가지고 있는 메서드 중 콘솔에 대한 출력을 하는 println 메서드가 존재하는 것이고 이것이 우리..

    ShallowCopy와 DeepCopy 완전 정복

    객체 세계인 자바 세상에서 여러분은 객체에 대한 복사를 해보신 적이 있나요? 아마 원시타입과 문자열의 복사의 경우는 많이 해보셨을겁니다. 그렇다면 객체에 대한 복사는 어떻게 처리될까요? 오늘은 이에 대해 알아보겠습니다. 자바 뿐 아니라 수많은 언어에선 복사를 크게 깊은 복사와 얕은 복사로 나눕니다. 여기서 깊은 복사란 원본에 대한 참조를 공유하지 않고 복사하는 것을 말합니다. 즉 바꿔 말하면 수정 사항이 발생할 경우 원본 객체와는 상관없는 다른 객체가 됩니다. 반면에 얕은 복사는 원본에 대한 참조를 공유한 채로 복사하는 것을 의미합니다. 우리가 아는 자바는 어떠한 상황에서 깊은 복사와 얕은 복사를 진행할까요? 원시타입과 불변객체의 복사 /* 원시타입의 복사 */ int origin = 0; int cop..

    객체의 중복/정렬 그리고 Collection

    Collection Framwork에 속하는 자료구조에 기본형이 아닌 객체를 넣는다면 어떻게 될까요? 넣으면 넣는거지 무엇이 문제인가 생각하시는 분들도 계실겁니다. 예를 들어 TreeSet에 기본형이 아닌 우리가 만든 객체를 넣는다 가정해봅시다. 객체의 중복이 제거되고 정렬이 되겠죠? (해당 사실이 이해가 가질 않는다면 [Java/Grammer] - Simple Data Structure (2) - List/Set/Map 참조) 하지만 객체가 같다는 것을 어떻게 알고, 무엇을 기준으로 정렬을 할지 TreeSet이 어떻게 알수 있을까요? 객체의 중복 기준 설정 두 객체의 중복 기준을 세우려면 hashCode와 equals 메서드를 오버라이딩해야 합니다. 왜냐하면 Collection Framework는 중복..