java

[Java] 생성자 및 상속에서의 생성자
※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요! C++, Java를 공부하며 생성자에 대해 깊게 고민한 적이 없었는데, 이번 포스팅을 계기로 심화된 학습을 해 보고자 한다. [ 1 ] 생성자란? 생성자는 인스턴스를 생성할 때 클래스 내부에서 가장 먼저 호출되는 특별한 메소드이다. 흔히 인스턴스를 생성할 때 new 연산자 바로 뒤에 오는 클래스 이름과 같은 메소드가 생성자이다. - class 객체변수 = new class(); 에서 class()가 생성자를 호출하는 것이다. 그렇다면 생성자는 어떻게 선언하는 것일까? 우선, 우리는 클래스를 선언할 때 명시적으로 생성자를 선언하지 않아도 해당 클래스를 문제 없이 사용할 수 있다. class A { int var1; int ..

[Java] 클래스(class)의 구성과 클래스 멤버 및 인스턴스 멤버
※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요! [ 1 ] 클래스의 구성 클래스는 멤버(member)로 구성되는데, 멤버에는 필드(field), 메소드(method), 생성자(constructor)가 있다. 필드(field)라는 용어가 생소하여 더 공부해 보았는데, 필드는 결국 "클래스 전역에서 접근할 수 있는 변수"를 의미했다. - 필드의 역할 (1) 객체의 고유 데이터를 저장한다. (2) 객체가 가져야 할 부품을 저장한다. (3) 객체의 현재 상태를 저장한다. - 필드 특징 (1) 필드 선언을 위해서는 [접근 지정자] [필드의 타입] [필드의 이름] 3가지를 정해줘야 한다. (2) 생성자와 메소드 밖에서 선언되어야 한다. (생성자, 메소드 내에서 생성된 변수는 로컬..

[Java] 제네릭(Generic)
※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요! [ 1 ] 기본 개념 제네릭(Generic): 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이다. C++에 익숙한 사람이라면 template가 떠오를 것이다(단, 역할은 비슷하지만, 차이점도 많다!) class Student { public T info; } Student s1 = new Student(); Student s2 = new Student(); 위의 가 Generic이다. Student라는 class를 정의하는 시점에서는 info의 DataType을 명시적으로 지정하지 않고 있다가, s1이라는 Student의 인스턴스를 Student으로 만들어낼 때 info가 String이라는 DataType을..

[알고리즘/Java] 슬라이딩 윈도우(Sliding Window)
[ 1 ] 기본내용 슬라이딩 윈도우는 이전에 포스팅한 투 포인터(Two Pointers) 알고리즘과 원리가 유사한 알고리즘이다. 투 포인터 알고리즘은 2개의 포인터를 활용하여 부분 배열의 길이를 유동적으로 활용하거나 2개의 특정 원소 값에만 접근하는 반면, 슬라이딩 윈도우는 부분 배열의 길이가 고정적이라는 특징이 있다. "한 정수 배열에서 길이가 3인 부분 배열 중 합이 가장 큰 부분 배열은 무엇인가?"라는 문제가 있다고 가정하자. - arr = [3, 5, 2, 1, 7, 4, 10, 6, 8, 9] 위 배열이 주어졌을 때 가장 큰 부분 배열의 합을 구하기 위해서 중첩 반복문을 활용할 수 있을 것이다. 하지만, 중첩 반복문을 활용할 경우 시간 복잡도가 O(N^2)이기 때문에 효율적이지 않다. 이때 슬라..

[알고리즘/Java] 투 포인터(Two Pointers)
[ 1 ] 기본내용 "투 포인터"는 1차원 배열에서 각기 다른 원소를 가리키는 2개의 포인터를 활용하여 원하는 값을 얻는 알고리즘이다. 이때, 포인터는 C/C++에서의 포인터가 아닌 배열에서의 "인덱스"를 의미한다. 2개의 포인터를 적절히 이동시키며 시간 복잡도를 최적화할 수 있는 것이 투 포인터 알고리즘의 핵심이다. 투 포인터가 자주 활용되는 문제로는 (1) target 값을 미리 설정하고, 특정 배열 내에 target 값과 같은 - 유사한 부분 합이 몇 개 존재하는지 계산하는 문제 (2) 배열 내 target = arr[i] + arr[j] 를 만족하는 (i, j) 쌍이 몇 개 존재하는지 계산하는 문제 등이 있다. [ 2 ] 부분 합에서의 투 포인터 해당 내용은 대표 예제인 백준 2003번을 통해 살..

[알고리즘/Java] 구간 합(Prefix Sum)과 관련 예제(BOJ-11659)
[ 1 ] 정수 배열 A에서 특정 구간(i ~ j) 내 모든 원소의 합을 구하라 특정 배열이 주어지고 위와 같은 질문을 받는다면, 우리는 어떻게 특정 구간 내 모든 원소의 합을 구할 수 있을까? 시간 제한이 없고 배열 원소의 수가 적다면 단순히 선형 탐색으로 i ~ j 까지의 특정 구간 내 원소의 합을 구할 수 있을 것이다. 하지만, 배열 내 원소의 수가 매우 많고, 계산해야 할 특정 구간도 많이 주어진다면 위와 같은 선형 탐색은 오랜 시간이 소요될 것이다. [ 2 ] 구간 합(Prefix Sum) [2 - 1] 정의 구간 합 알고리즘을 활용하면 선형 탐색으로 O(n)이 소요되던 시간 복잡도를 O(1)으로 줄일 수 있다. 어떻게 이것이 가능한가? 우선 A라는 정수 배열이 있을 때 S라는 '합 배열'을 정..

[용어 사전] 컴파일 언어 vs 인터프리터 언어
[ 1 ] 컴파일 언어 만약, C언어로 코딩을 입문했다면 관련 서적에서 '컴파일'이라는 단어를 쉽게 찾아볼 수 있었을 것이다. '컴파일'이란 쉽게 말하자면 개발자가 작성한 소스 코드를 컴퓨터가 이해할 수 있도록 번역하는 과정이다. 컴파일 언어는 개발자가 작성한 소스 코드를 컴파일러를 통해 기계어로 변환한 후 하나의 실행파일을 생성한다. 소스 코드가 방대한 경우 컴파일하는데 상당히 오랜 시간이 걸릴 수 있다는 단점이 있지만, 컴파일 후 생성된 실행파일은 기계어로 작성되어 있기 때문에 런타임이 빠르다는 장점이 있다. 대표적인 컴파일 언어로는 C, C++ 등이 있다. - 실제 C++ 컴파일 과정 (1) 헤더파일 등의 전처리기 매크로들을 처리하는 전처리(Preprocessing) 단계 (2) 소스 파일을 어셈블..