목록분류 전체보기 (200)
사이먼's 코딩노트

이번에는 여지껏 배운 Java 문법을 이용하여 인력관리소를 운영하는 문제를 풀어봅시다. [문제] 다음 Main 메서드를 보고 주석에 작성된 대로 출력되게 클래스와 메서드를 추가해보세요. public class Main { public static void main(String[] args) { 사람인력관리소 a사람인력관리소 = new 사람인력관리소(); a사람인력관리소.add사람("홍길순", 33); // 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다. a사람인력관리소.add사람("홍길동", 20); // 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다. a사람인력관리소.add사람("임꺽정", 30); // 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다. 사람 a사람1 = a사람인력관..

이번에는 포인터, 배열과 문자열의 심화된 문제를 풀어봅시다. [문제 1] 다음은 문자열이 특정 문자열로 시작하는 지 검사하는 함수를 구현해보세요. #include typedef int bool; #define true 1 #define false 0 int get_str_len(char* str) { for ( int i = 0; true; i++ ) { if ( str[i] == '\0' ) { return i; } } } bool starts_with(char* str, char* start) { int str_len = get_str_len(str); int start_len = get_str_len(start); if(start_len > str_len) { return false; } for(i..

이번에는 여지껏 배운 포인터, 배열과 문자열, 공공재 지역에 관한 문제들을 풀어봅시다. [문제 1] 변수 str1, str2, str4의 값이 같은 이유를 설명하세요. #include int main(void) { char* str1 = "abc"; printf("str1 : %ld\n", (long)str1); char* str2 = "abc"; printf("str2 : %ld\n", (long)str2); char* str3 = "abcd"; printf("str3 : %ld\n", (long)str3); char* str4 = "abc"; printf("str4 : %ld\n", (long)str4); char str5[10] = "abc"; printf("str5 : %ld\n", (long)s..

[공공재 지역] [case #1] #include int main() { char* str1 = "abc"; char* str2 = "abcd"; char* str3 = "abc"; printf("str1 : %ld\n", (long)str1); printf("str2 : %ld\n", (long)str2); printf("str3 : %ld\n", (long)str3); return 0; } 위 코드에서 str1은 4바이트 짜리 '문자열(문자배열)' 상수를 생성한다. 단, 해당 문자열 abc는 '공공재'만 저장되는 메모리의 특수한 구역에 저장된다. '공공재' 라고 표현한 이유는 "abc"는 2번 이상 쓸 때부터는 문자열이 새로 생성되지 않고 기존에 생성된 배열의 시작 주소를 리턴하기 때문이다. 실제로 ..

[define과 typedef] C언어에는 헤더파일을 포함하는 #include 외에 사용자가 임의로 프로그램 내에서 정의할 수 있는 #define이 있다. 또한 C언어에는 각 자료형 타입을 사용자가 임의로 정의할 수 있는 typedef가 있다. 아래는 #define과 typedef를 이용해 boolean이라는 타입이 없는 C언어에서 true, false를 사용할 수 있는 코드이다. #include #define false 0 #define true 1 typedef int bool; int main(void) { bool is_even = false; while ( is_even ) { } while ( false ) { } while ( true ) { printf("true는 1 이다.\n"); br..

[추상 클래스] 아래 코드를 해석하면서 추상 클래스라는 새로운 개념에 대해 소개하겠다. public class Main { public static void main(String[] args) { 칼 a무기1 = new 칼(); 활 a무기2 = new 활(); 총 a무기3 = new 총(); // 모든 무기 작동(); a무기1.작동(); a무기2.작동(); a무기3.작동(); } } abstract class 무기 { abstract void 작동(); } class 칼 extends 무기 { void 작동() { System.out.println("칼 작동"); } } class 활 extends 무기 { void 작동() { System.out.println("활 작동"); } } class 총 ex..

[생성자 문제] 다음은 생성자와 관련된 문제를 풀어보고 비교해봅시다. 문제의 목적은 다음과 같습니다. 각각의 사람이 배달음식을 주문할 때, 각자의 상황과 기호에 따라 적절한 음식점과 음식이 배달되도록 코드를 작성하는 것이다. 우리는 해당 문제를 두 가지 버전으로 나눠서 풀어보려 합니다. 첫번째 코드는 main 메서드에서 일일이 속성 값들을 저장하여 원하는 출력문을 출력하는 코드이고, 두번째 코드는 생성자를 통해 값을 최초에 세팅하고 원하는 출력문을 출력하는 코드이다. 두 코드를 잘 비교하면서 더 편리한 방법이 어떤 것인지 느껴봅시다. [첫번째 코드] public class Main { public static void main(String[] args) { 사람 a김철수 = new 사람(); a김철수.이..

[캐스팅] Java에서는 형변환을 캐스팅이라고 한다. 여기서 말하는 형변환이란 말그래도 형태를 변환한다는 뜻이다. 예를 들어 정수형 타입인 int와 실수형 타입인 double이 있다면 서로의 타입으로 형태를 변환하는 것이 캐스팅이라고 한다. int i = 10; double d = i; i = (int)d; System.out.println(i); 위 코드를 보면 변수 i는 정수 타입으로 선언되었고 10이라는 값을 넣었다. 변수 d는 실수 타입으로 선언되었고 i가 가지고 있는 10이라는 값을 넣었다. 여기서 먼저 d를 출력문을 통해 출력해보면 10이 아닌 실수 타입에 맞춰 10.0이 출력될 것이다. 이 때 i가 가지고 있는 정수 10은 자동으로 형변환 즉, 캐스팅이 된 것이다. 이번에는 반대로 정수인 1..

[scanf] 출력문을 사용하는 문법을 printf 라고 하면 키보드 입력을 위한 문법은 scanf이다. C언어는 기본적으로 #include 라는 헤더파일을 포함하고 이 때 stdio.h는 표준 입출력을 의미한다. 아래는 scanf의 가장 기본적인 구조이다. #pragma warning(disable: 4996) #include int main() { int input; printf("정수를 입력해주세요. : "); scanf("%d", &input); printf("입력하신 수는 %d 입니다.\n", input); return 0; } 사용자가 키보드로 입력한 정수를 input에 넣어주는 일을 해주는 scanf는 일종의 외부 대행업체라고 생각할 수 있다. scanf는 입력받은 값을 어디에 넣어줄 지 사..

[배열] 아래는 배열의 형태를 코드로 작성한 것이고 포인터와 유사한 점을 찾아봅시다. #include int main(void) { int arr[2000]; int arr1[3] = {1, 2, 3}; int *p = arr1 + 1; printf("%d\n", p[0] + p[1]); return 0; } 위 코드와 같이 배열의 생김새는 [ ] 와 같다. arr이라는 배열 공간에 총 int 타입의 2000개의 변수, 8000 바이트를 관리한다는 뜻이다. arr은 포인터에서의 주소와도 같은 의미로써 한 공간에 메모리 크기가 무조건 8바이트 이다. 포인터에서 * 가 해당 주소로 간다 라는 의미였다면 배열에서는 [ ] 가 그와 같은 의미가 담겨있다. arr1변수와 같이 배열은 항상 배열 중 가장 첫번째 자..