전체 글
[OOP] 원시 타입을 포장하라
[OOP] 원시 타입을 포장하라
2023.03.15원시 타입 원시 타입(Primitive Type)은 알다시피 실제 데이터 값을 저장하는 타입으로 평소 많이 사용하는 형태이다. 원시 타입에는 보통 boolean, char, int, double 등 여러가지가 있다. 원시 타입을 포장하라? 원시 타입의 값을 객체로 포장하면 객체지향적으로 얻을 수 있는 이점들이 많다. 그럼 한 번 무엇이 있는지 살펴보자. 자신의 상태를 객체 스스로 관리할 수 있다 Wallet이라는 클래스에서, 사용자의 돈(cash)을 가지고 있다고 가정해보자. public class Wallet { private int cash; public Wallet(int money) { this.cash = cash; } } 위 형태처럼 원시 타입인 int로 돈을 가지고 있으면 어떨까? 일단 다음..
[OOP] 상속보다는 조합을 사용하자
[OOP] 상속보다는 조합을 사용하자
2023.03.15상속을 왜 사용하는가? 먼저 제목 내용을 살펴보기 전에 상속을 왜 사용하는지에 대해 생각해 볼 필요가 있다. 우리는 상속을 왜 사용하는가? 먼저 대부분의 이유는 다음과 크게 다르지 않다고 생각한다. 코드를 재사용하여 중복을 줄인다 변화에 대해 유연해지고 확장성이 증가한다. 개발 시간이 줄어든다. 하지만 위 내용은 상속을 적절히 사용했을 경우에만 해당한다. 상속을 잘못 사용하게되면 변화에 유연하지 않고 에러를 내기 쉽다. 상속의 단점 상속은 상위 클래스의 구현이 하위 클래스에 노출되기 때문에 캡슐화를 깨트린다. 캡슐화가 깨짐으로써 하위 클래스가 상위 클래스에 강하게 결합, 의존하게되고 강한 결합과 의존은 변화에 유연하게 대처하기 어려워진다. 예제를 통해서 살펴보자. 다음 예제는 로또 번호와 당첨 번호를 가..
[Network] UTP 케이블
[Network] UTP 케이블
2023.03.15UTP 케이블? UTP 케이블은 Unshield Twisted Pair 케이블의 줄임말로 절연체로 감싸여 있지 않은 쌍으로 꼬인 케이블을 의미한다. 우리가 흔히 랜선이라고 부르는 케이블이다. 큰 범주로 이더넷 케이블이라고 부르기도 한다. UTP 케이블 뿐만 아니라 STP(Shield Twisted Pair) 케이블도 있다. UTP 케이블 카테고리 UTP 케이블은 전송 가능 대역폭에 따라 카테고리별로 분류한다. 아무리 빠른 네트워크가 들어와도 스펙에 맞지 않는 케이블을 사용한다면 빠른 전송속도를 사용할 수 없다. 카테고리 1: 주로 전화망에 사용하는 용도로 만들어진 케이블. 데이터 전송용으로는 부적합하다. 카테고리 2: 데이터를 최대 4Mbps의 속도로 전송할 수 있는 능력을 가지고 있는 케이블 카테고리 ..
[Network] 이더넷(Ethernet)
[Network] 이더넷(Ethernet)
2023.03.14이더넷(Ethernet)? 컴퓨터 네트워크 기술 중 하나로 사무실, 학교, PC방 등의 LAN(근거리 통신망) 환경에서 많이 활용되고 있는 네트워크 구성 방식이다. 초기의 이더넷은 동축 케이블을 이용하여 버스형으로 네트워크를 구성했었지만 하나의 네트워크 선을 공유하여 사용하였기에 데이터 충돌이 발생했고, 이를 해결하기 위해 CSMA/CD라는 기술이 제안되어 표준으로 채택되었다. 현재는 UTP 케이블 및 광케이블을 사용하는데, 단거리 또는 옥내에서는 UTP 케이블을 사용하고, 먼 거리나 전자파 간섭이 심한 환경에서는 광케이블을 통해 전송한다. 이와 함께 네트워크 구조도 버스형에서 스타형으로 변경되어 모든 케이블이 모이는 네트워크 허브 및 스위칭 허브를 사용하게 되었다. CSMA/CD? CSMA/CD는 LA..
[OOP] instanceof의 사용을 지양하라
[OOP] instanceof의 사용을 지양하라
2023.03.14instanceof? instanceof는 인스턴스의 타입을 확인하는데 사용하는 연산자이다. 즉, 다음과 같은 형식으로 사용할 수 있다. 다음은 car이 Avante에 해당하는지 체크하는 조건문이다. if (car instanceof Avante) { System.out.println("is Avante"); } instanceof의 사용을 지양하라? 유용해보이는데 왜 지양하라고 하는 것일까? 객체지향적이지 못하기 때문이다. instanceof 보다는 다형성을 활용하여 작성하는 것이 권장되는데, 그 이유가 무엇일까? 다형성 vs instanceof 다형성 interface Car { void operate(); } class Avante extends Car { public void operate() {..
[Algorithm] 플로이드-워셜(Floyd-Warshall)
[Algorithm] 플로이드-워셜(Floyd-Warshall)
2023.03.12플로이드-워셜(Floyd-Warshall)? 플로이드-워셜은 그래프에서 가능한 모든 노드 쌍에 대해 최단 거리를 구하는 알고리즘이다. 다익스트라 알고리즘과는 달리 모든 노드 쌍에 대해 최단 거리를 구하고, 음의 가중치를 가지는 그래프에서도 쓸 수 있다는 것이 특징이며 다익스트라보다 구현이 쉽다. 플로이드-워셜은 모든 지점에서 다른 모든 지점까지의 최단 거리를 저장해야하기 때문에 2차원 배열에 최단 거리 정보를 저장한다. 또한, DP의 특징을 가지고 있어서 노드의 개수(N)번 만큼의 단계를 반복하며 점화식에 맞게 2차원 배열을 갱신해나간다. 구현 설명 플로이드-워셜은 임의의 노드 s에서 e까지 가는데 걸리는 최단거리를 구하기 위해, s와 e 사이의 노드인 m에 대해 s에서 m까지 가는 데 걸리는 최단거리와..
[Baekjoon] 1654: 랜선 자르기
[Baekjoon] 1654: 랜선 자르기
2023.03.11문제 다양한 길이를 가진 n개의 랜선을 가지고 일정한 길이를 가진 k개의 랜선을 만들 때 만들 수 있는 최대 길이를 구하는 문제이다. 풀이 내 풀이 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Q1654 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] nk = br.readLine().split(" "); int n = Integer.parseInt(nk..
[Algorithm] 상계/하계(Upper Bound/Lower Bound)
[Algorithm] 상계/하계(Upper Bound/Lower Bound)
2023.03.11상계/하계(Upper Bound/Lower Bound)? Lower Bound와 Upper Bound는 이진 탐색을 기반으로 하여 경곗값을 찾는 알고리즘이다. 이진 탐색을 기반으로 하기 때문에 당연히 데이터가 정렬되어 있어야 한다. 값을 찾을 때, 원하는 값이 없을 때 못찾았다는 신호(-1, false 등)를 반환하는 일반적인 이진 탐색과 달리 Upper Bound와 Lower Bound를 이용하면 찾고자 하는 값 또는 그 값의 초과값이 처음 나타나는 위치를 찾을 수 있다. 때문에 주로 특정 값을 어느 위치에 삽입해야 하는지 탐색할 때 많이 사용한다. 상계 (Upper Bound) Upper Bound는 찾고자 하는 값(target)보다 큰 값의 처음 위치를 반환한다. 구현 public class Upp..
[Algorithm] 이진 탐색(Binary Search)
[Algorithm] 이진 탐색(Binary Search)
2023.03.11이진 탐색(Binary Search)? 이진 탐색이란 데이터가 정렬되어 있는 상태에서 탐색 범위를 줄여나가며 특정한 값을 탐색하는 알고리즘으로, 탐색할 때마다 탐색 범위가 반으로 줄어들기 때문에 속도가 빠르다는 장점이 있다. 구현 코드 public class BinarySearch { public static void main(String[] args) { int[] array = {1, 3, 4, 6, 7, 9, 10, 11, 14, 16, 17, 20}; int target = 16; int left = 0; int right = array.length - 1; while (left right가 되므로 종료한다) 시간 복잡도 선형 탐색의 경우 O(n)이지만 이진 탐색의 경우 O(log n)이므로 대부..
[Algorithm] 모듈러 산술(modular Arithmetic)
[Algorithm] 모듈러 산술(modular Arithmetic)
2023.03.09모듈로(Modulo) 연산 컴퓨팅에서 어떤 한 숫자를 다른 숫자로 나눈 나머지를 구하는 연산으로, 나머지 연산(mod)이라고 한다. 즉 일반적으로 정수 범위의 내에서 대부분 a를 n으로 나눈 나머지 r과 몫 q는 다음을 충족한다. 일반적으로 a와 n이 모두 정수인 상태에서 수행되지만 요즘은 많은 곳에서 정수 범위 이상의 피연산자를 사용할 수 있다. 하지만, mod 0은 Divide by Zero 에서 예외가 발생할 수 있기 때문에 주의해야한다. 이 모듈로 연산에 관련된 규칙이 모듈러 산술이다. 모듈러 산술(Modular Arithmetic) 모듈로 합동(Congruence Modulo) 두 정수 a, b와 정수 n (n > 1)이 주어질 때 n이 a, b의 차의 약수인 경우 (즉, a - b = kn을 ..
[Java] 아무 생각 없이 생성했는데 동일한 객체?
[Java] 아무 생각 없이 생성했는데 동일한 객체?
2023.03.09Integer.valueOf(127) == Integer.valueOf(127)은 true? Integer.valueOf(127) == Integer.valueOf(127)은 true가 출력된다고 한다. 뭔가 이상하다. 배운대로라면 Integer는 클래스, 즉 참조 타입이기 때문에 다른 객체가 생성되어 false가 떠야 맞는 것 같은데 그렇지가 않다. 그럼 다른 객체로 생성이 안된다는 얘기일까? 한 번 살펴보자. 다음 코드의 실행 결과를 한 번 예상해보자. public class IntegerCacheCheck { public static void main(String[] args) { System.out.println(Integer.valueOf(128) == Integer.valueOf(128)); ..
[Baekjoon] 1167: 트리의 지름
[Baekjoon] 1167: 트리의 지름
2023.03.08문제 트리에서 두 점 사이의 거리가 가장 긴 길이를 트리의 지름이라 하는데 트리의 지름을 구하는 문제이다 풀이 내 풀이 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Q1167 { private static List tree; private static boolean[] visited; private static int maxVertex; private static int max; public static void main(String[] args) throws IOException { BufferedReader br = new..