본문 바로가기

Java

(13)
[Java] Optional 사용법 1. Optional을 사용하는 이유 개발을 할 때 많이 만나는 예외가 NullPointerException(NPE)이다. NPE를 피하기 위해 조건문을 사용해서 null 여부를 검사하곤 하지만, null 값을 검사하는 로직이 추가되면서 코드가 복잡해진다. List datas = getData(); datas.sort(); // datas가 null이면 NullPointerException이 발생함 List datas = getData(); // NPE를 방지하기 위해 조건문으로 null 검사 진행해야 함 if (datas != null) { datas.sort(); } 조건문을 사용하지 않으면서 NPE를 방지하기 위해 Java8부터 도입된 기능이 Optional 클래스이다. 다시 말해 Optional ..
[Java] 배열 깊은 복사, 얕은 복사 ( feat. 원소가 객체라면? ) 문제점 ) 객체를 요소로 가진 A 배열이 있다. 새로운 B 배열을 만들고 A 배열의 요소들을 복사해서 저장하고 싶다. A 배열의 객체 요소를 변경해도 B 배열 내부의 요소들은 영향을 받지 않아야 한다. 어떻게 해야 할까? 해결책 ) 깊은 복사를 배열 자체만 하면 안 된다. 배열 내부에 저장된 요소 하나하나 깊은 복사 해서 저장해야 한다. 배열을 복사하는 방법은 크게 2 가지다. 얕은 복사 (Shallow Copy) 얕은 복사는 해당 배열의 '주소값'을 복사하는 것이다. 따라서 원본 배열의 주소값을 복사했기 때문에 원본 배열의 요소를 변경하면 복사된 배열도 동일하게 수정된다. int[] original = {1, 2, 3, 4, 5}; int[] copyArray = original; // 얕은 복사 or..
[Java] Map 인터페이스에서 값(value)을 기준으로 정렬하기 Map 인터페이스는 '키(key)' 와 '값(value)' 로 이뤄져있다. 키는 중복이 허용되지 않고, Map 인터페이스의 기준이 된다. 따라서 키가 정렬 기준이다. 만약 TreeMap 을 만들어 다음과 같이 코드를 넣으면 key 기준에 따라 정렬되어 저장된다. Map map = new TreeMap(); map.put("b", 100); map.put("a", 90); map.put("c", 80); map.put("d", 70); map.put("e", 60); Set set = map.entrySet(); System.out.println(set); // [a=90, b=100, c=80, d=70, e=60] 하지만 값(value)을 기준으로 오름차순하고 싶으면 어떻게 해야할까? 바로 EntryS..
[Java] Math.random( ) 원하는 범위 설정하기 Math.random( ) 의 원리는 다음과 같다. 0.0 < = Math.random( )
[Java] String ← → 기본형 값 (feat. 형변환) 1. 기본형 값 ☞ String 으로 변환 - String.valueOf( int n ) - n + "" 두 방법 모두 기본형을 문자열로 변경할 수 있다. 성능은 valueOf( ) 가 더 좋지만, 빈 문자열을 더하는 방법이 간단하고 편하기 때문에 성능향상이 필요한 경우에만 valueOf( ) 을 사용하면 된다. 2. String ☞ 기본형 값 으로 변환 - Integer.parseInt( String str ) / Byte.parseByte( String str ) / Double.parseDouble( String str ) / Short.parseShort( String str ) / Long.parseLong( String str ) / Boolean.parseBoolean( String str ..
[Java] String 클래스의 replace() & replaceAll() 메서드 1. replace( "기존 문자" , "바꿀 문자" ) String str = "AAAbbCCCddAAAEEE"; str = str.replace("AAA", "aaa"); System.out.println(str); // aaabbCCCddaaaEEE 2. replaceAll( "기존 문자" , "바꿀 문자" ) String str = "AAAbbCCCddAAAEEE"; str = str.replaceAll("AAA", "aaa"); System.out.println(str); // aaabbCCCddaaaEEE replace( ) 와 replaceAll( ) 둘 다 기능은 동일하다. String 문자열에서 기존 문자를 바꿔준다. 하지만 차이가 있다. replace( ) 는 '특정 문자열'을 '새로운..
[Java] 배열 복사하는 방법 ( feat. System.arraycopy() & Arrays.copyOf() ) 배열을 복사하는 방법은 크게 2가지가 있다. 1. System.arraycopy( 복사할 배열 원본, 시작 위치, 복사 당할 배열, 시작 위치, 복사할 개수 ) int[] test = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int[] copied = new int[5]; System.arraycopy(test, 0, copied, 0, 5); System.out.println(Arrays.toString(copied)); // [ 1, 2, 3, 4, 5 ] System.arraycopy( ) 는 복사를 시작할 위치와 복사할 개수를 매개변수로 지정한다. 2 - 1. Arrays.copyOf( 복사할 배열 원본, 복사할 개수 ) int[] test = {1, 2, 3, 4, 5, 6, 7, 8..
[Java] 배열과 리스트 사이의 변환 방법들 ( feat. Arrays.asList() ) 배열을 리스트로 변환하는 방법은 크게 두 가지로 나뉜다. 1-1. '객체' 배열인가? [ 배열 ☞ 리스트 ] 만약 '객체' 배열을 리스트로 변환하려면 다음과 같은 방법들이 있다. - Arrays.asList( ) 사용 : Arrays 클래스의 정적 메서드인 asList( ) 를 이용한다. 반환 타입은 List 형이다. asList( ) 는 크기가 정적인 리스트를 반환하기 때문에 값 변경은 가능하지만, 리스트 사이즈를 바꿀 수 없다. 리스트 사이즈를 변경하는 add, remove 메서드를 사용하면 예외가 발생한다. 배열과 리스트가 동기화 됐기 때문에 리스트의 값을 변경하면 원본 배열의 값도 변한다. String[] arr = { "A", "B", "C" }; List list = Arrays.asList(..
[Java] String 클래스의 .split() 메서드 사용하기 기본적으로 String 클래스의 split() 메서드는 'String 배열'을 반환한다. 다시 말해 주어진 조건을 기준으로 String 객체를 나누고, 나눠진 각각의 원소들을 String 배열의 요소로 넣는 것이다. String str = "010-1234-5678"; String[] nums = str.split("-"); // 매개 변수는 String 형이다. 해당 실행값은 [ 010, 1234, 5678 ] 이 된다. 만약 String 객체가 있는데 각 문자 하나씩 String[] 로 만들고 싶으면 어떻게 해야할까? 아주 간단하다. split() 메서드의 매개변수에 "" 을 넣으면 된다. 그러면 String 객체의 한 문자씩 String 배열의 원소로 넣어진다. String str = "124574..
[Java] System.out.printf() 메서드 사용법 (feat. String.format()) 연습문제 중 다음과 같은 표현으로 출력되는 예시가 있다. 내용에 따라 변하는 형태인데, 기존의 println()이나 print() 메서드로는 한계를 느꼈다. 위와 같이 출력하려면 어떻게 코드를 짜야할까? 정답은 printf()과 String.format() 메서드에 있다. 첫 번째 예시의 경우 특정 값을 변환하고자 하는 값으로 더 이상 나눌 수 없을 때까지 나누는 과정을 나타낸다. 출력하는 부분의 코드는 다음과 같다. System.out.printf(String.format("%%2d | %%%dd\n", n), r, x); do { System.out.printf(" +"); for (int i = 0; i < n + 2; i++) System.out.print('-'); System.out.print..
[Java] 가변인자로 받은 원소들은 어디로 향할까? (feat. Arrays.asList()로 리스트화 하기) 메서드를 사용하다 보면 '가변 인자'를 사용할 때가 있다. 가변 인자를 사용하면 해당 원소들은 어떻게 처리될까? 가변 인자 기능은 JDK1.5부터 사용이 가능해졌다. 그전까지는 메서드의 매개변수 개수가 고정적이었으나 해당 업데이트 이후부터 매개변수 개수를 "동적"으로 지정할 수 있게 된 것이다. 가변 인자는 '매개변수 타입... 변수명' 형식으로 선언한다. // 예시 String concatenate(String... str) {...} 가변인자의 기능 원리는, 가변 인자가 내부적으로 '배열'을 생성하고 매개변수에 들어온 원소들을 해당 배열에 배치한다. 아래 예제에서 변수명 args는 개발자가 입력한 매개변수들로 만들려는 배열의 이름과 동일하다. public String[] method1(String....
[Java] '재귀 함수'를 사용해서 내부 객체를 탐색하기 (feat. 족보 구현) 여기 Human(사람) 클래스가 있다. public class Human { private String name; private String gender; private ArrayList subHumanList; public Human(String name, String gender) { this.name = name; this.gender = gender; subHumanList = new ArrayList(); } public void addHumanList(Human human) { subHumanList.add(human); } } 사람 한 명을 만들면, 그 사람은 '이름'과 '성별'을 가진다. 이름과 성별은 한 개의 값만 가지는 것이 자연스럽다. 그리고 그(또는 그녀)는 자식을 낳을 수 있다. ..
[OOP] 객체지향 개발 5대 원칙, 'SOLID'란 무엇인가? SOLID란 무엇인가 개발자 면접에서 많이 등장하는 개념으로 좋은 객체지향 프로그래밍을 하는데 준수해야 하는 5가지 원칙을 말한다. 이와 같은 원리들을 적용하면 코드의 유지보수가 굉장히 수월해진다. 단일 책임의 원칙 (Single Responsibility Principle) [SRP] 하나의 클래스에 너무 많은 데이터, 기능, 책임을 부여하면 안 되고, 모든 클래스는 각각 하나의 책임만 가져야 한다. SRP를 위반한 좋지 못한 케이스 public class man { public eat() {} // 인간으로서 역할 public takeClothes() {} public goToBathroom() {} public void kiss() {} // 남자친구 역할 public void giveHerPres..