본문 바로가기

프로그래밍 언어 정리

(11)
[C/C++] 포인터와 상수 int i1 = 1; int i2 = 2; const int* p1 = &i1; int* const p2 = &i2; 상수 키워드 const와 포인터를 쓰다보면 같아 보이지만 위의 코드처럼 다른 두 가지 경우가 등장합니다. p1의 const는 p1이 참조하는 i1의 값을 바꾸지 못하게 합니다. p2의 const는 p2가 값을 바꾸지 못하게 합니다. 말로만 보면 어려우니 코드로 확인해보겠습니다. #include using namespace std; int main() { const char * s1 = "Hello"; int i1 = 1; int i2 = 2; const int* p1 = &i1; int* const p2 = &i2; int i3 = 3; int i4 = 4; (*p1) = 11; // 이..
[C/C++] bad_array_new_length 백준 5836번 문제를 풀어서 제출했는데 segfault가 나왔습니다. 어느 정도 간 거 보니까 로직은 맞았는데... 무엇을 놓쳤을까 이런저런 확인을 하다가 큰 입력이 주어졌을 때 해당 콜을 뱉고 코드가 종료되었습니다. chat gpt말고도 더 검색해보니... sort를 할 때 벡터가 매우 크거나, 사이즈로 음수를 참조하는 일이 발생하면 위와 같은 에러를 발생시킨다고 합니다. 벡터가 동적이다 보니 이런 일이 발생합니다. 문제는 벡터의 크기는 900미만에 내부벡터의 크기도 약 10내외정도로 큰 크기는 아니었습니다. 또 cmp를 빼주니 멀쩡히 돌아갑니다. 벡터의 크기가 크지 않았음을 이용하여 직접 선택정렬을 구현하는 방식으로 문제를 해결하였습니다. 추론을 해보자면 다차원 벡터이면서, 직접 정렬방법을 구현하고..
[C/C++] call by value, call by address(pointer), call by reference reference / not reference reference == not copy not reference == value, address == copy ∴ call by value => value copy call by address => pointer copy call by reference => reference
[C++] NULL과 nullptr NULL과 0은 다릅니다. NULL은 포인터이고 0은 int이니 사실은 비교도 되지 않습니다. NULL과 NOT NULL로 나뉘고, 0은 그저 NOT NULL에 불과합니다. [NULL] 초기화조차 안 한 상태. 포인터 변수에 넣어서 0 주소를 넣는 용도로 사용할 수도 있지만 일반 변수에도 넣을 수 있습니다. 분명 위에서 NULL은 포인터라고 했는데 일반 변수에 들어간다니 조금 의아합니다. 아래에서 확인해 봅시다. #include using namespace std; int main(void) { int a = NULL; // 가능 int* b = NULL; // 가능 cout
[기초 다지기 - 3] 람다 표현식 함수형 프로그래밍을 통해 함수를 하나의 표현식으로 나타낸 것이 람다 표현식입니다. 익명함수이고, 사용하면 코드가 간결해지고, 재사용이 불가능하고, 그 외에도 함수형 프로그래밍의 특징과 장단점을 갖고 있습니다. 함수형 프로그래밍에 대한 내용은 다른 글에서 따로 설명하겠습니다. 알고리즘 문제풀이를 하다 보면 객체를 정렬하는 상황이 많이 생기는데, 이를 람다 표현식을 이용해 코드를 작성하겠습니다. 클래스 타입 배열의 객체들을 정렬하는 방법으로는 두 가지 방법이 있습니다. 클래스 내에서 정의한 우선순위를 적용시키는 방법 (기초 다지기 - 2: 클래스에서 구현) 클래스 외부에 작성한 함수를 이용해 우선순위를 적용시키는 방법 2번 방법을 람다 표현식으로 구현하였습니다. 추가로 이 글에서는 람다 표현식을 전부 변수에..
[Java] public static void main(String args[]) Java를 처음 배울 때 그냥 기계적으로 쓰던 문장. 이 문장이 무슨 뜻인지 하나씩 뜯어보도록 하겠습니다. [public] 접근 지정자입니다. 접근 지정자로는 아래의 네 가지가 있습니다. public: 공용 멤버, 모든 클래스에서 사용 가능. 다른 패키지에서도 import를 통해 사용 가능. private: 전용 멤버, 해당 클래스에서만 사용 가능. protected: 보호 멤버, 해당 클래스 및 서브 클래스(상속받는 클래스)만 사용 가능. package: 패키지 멤버, 같은 패키지에서만 사용 가능. (접근 지정자를 명시하지 않으면 패키지 멤버가 됩니다.) 이 중에서 public을 사용한 것입니다. 자바 가상 머신 (Java Virtual Machine)이 main문에 접근하기 위해 public을 사용합..
[Java] 컴파일 일반적인 경우, 컴파일러는 소스 코드가 작성된 소스 파일을 읽어 기계어로 변환한 후 오브젝트 파일에 저장합니다. 리눅스 환경에서 C 소스 코드를 컴파일했을 때 볼 수 있는, 확장자가 .c인 파일이 소스 파일, 확장자가 .o인 파일이 오브젝트 파일에 해당합니다. 그러나 Java의 경우에는 컴파일러가 소스 코드를 기계어로 바로 변환하지 않습니다. 컴퓨터를 위한 기계어가 아닌, 자바 가상 기계(JVM)를 위한 중간 코드인 바이트 코드를 생성합니다. 바이트 코드는 기계어와 일치하지는 않으나, 어떠한 기계어와도 쉽게 변환할 수 있습니다. Java 소스 코드를 컴파일 했을 때 볼 수 있는, 확장자가 .java인 파일이 소스 파일, 확장자가 .class인 파일이 바이트 코드로 작성된 파일입니다. 자바 가상 기계(JV..
[기초 다지기 - 2] 클래스 이름, 나이, 성적을 담을 수 있는 클래스를 만들고, 여러 기능(메소드)을 추가하여 코드를 작성하겠습니다. 구현할 메소드는 아래와 같습니다. 이름, 나이, 성적을 인자로 받아 객체를 만드는 생성자 현재 객체와 인자로 받은 객체를 비교하여 누구의 성적이 더 높은지 반환하는 문자열 타입 메소드 숫자 하나를 인자로 받아 해당 학생의 점수가 숫자보다 높은지 반환하는 boolean 타입 메소드 정렬 시 학생들의 번호가 내림차순으로 정렬(점수가 같다면 번호를 오름차순으로 정렬) 될 수 있도록 하는 우선순위 메소드. 객체 지향 언어를 사용하나, 편의를 위해 정보를 은닉하지 않았습니다. 문제 풀이 환경이 아니라면 꼭 은닉화를 하는 것을 권장합니다. [Java] import java.io.*; import java.ut..