///
Search
📫

박중현

날짜
2022/07/11
태그
잔디
속성

C언어

정적 할당과 동적 할당

정적 할당
#include <stdio.h> #define MAX_SIZE 600 #define true 1 #define false 0 typedef int bool; int main(void) { int arr[MAX_SIZE]; int size; while ( true ) { printf("관리하실 숫자를 입력해주세요 : "); scanf("%d", &size); if ( size > MAX_SIZE ) { printf("죄송하지만 %d 이하로 입력해주세요.\n", MAX_SIZE); } else { break; } } for ( int i = 0; i < size; i++ ) { printf("%d번째 숫자를 입력해주세요 : ", i); scanf("%d", arr + i); } printf("== 숫자 출력 ==\n"); for ( int i = 0; i < size; i++ ) { printf("%d번째 숫자 : %d\n", i, arr[i]); } return 0; }
Java
복사
동적 할당
#include <stdio.h> #include <stdlib.h> #define true 1 #define false 0 typedef int bool; int main(void) { int* arr; // 8 int size; // 4 printf("관리하실 숫자를 입력해주세요 : "); scanf("%d", &size); // 100 arr = malloc(sizeof(int) * size); for ( int i = 0; i < size; i++ ) { printf("%d번째 숫자를 입력해주세요 : ", i); scanf("%d", arr + i); } printf("== 숫자 출력 ==\n"); for ( int i = 0; i < size; i++ ) { printf("%d번째 숫자 : %d\n", i, arr[i]); } free(arr); return 0; }
Java
복사
정적 할당과 동적 할당의 장단점 정적할당 - 단점 : 프로그램 실행 도중 배열 사이즈 변경 불가능 - 장점 : 배열의 메모리는 자동할당, 자동반납 동적할당 - 단점: 배열의 메모리는 수동할당(malloc), 수동반납(free) - 장점: 프로그램 실행하면서 사이즈를 바꿀 수 있음

자바

형변환

형변환이 없는 경우
class Main { public static void main(String[] args) { 저장소.저장(10); 저장소.저장("안녕"); 저장소.저장(new 사람()); 저장소.저장(new 사과()); 저장소.저장(5.5); 저장소.저장(false); 저장소.저장('a'); // 정수 계열 byte b = 0; // 1바이트 char c = 1; // 2바이트 short s = 2; // 2바이트 int i = 3; // 4바이트 long l = 4; // 8바이트 // 실수 계열 // 4.1f => float 형 실수를 의미 float f = 3.14f; // 4바이트 // 3.141592 => double 형 실수를 의미 double d = 3.141592; // 8 바이트 // 논리 계열 boolean bl = false; // 1/8 바이트, 1비트 저장소.저장(b); 저장소.저장(s); 저장소.저장(c); 저장소.저장(i); 저장소.저장(l); 저장소.저장(f); 저장소.저장(d); 저장소.저장(bl); } } class 저장소 { static void 저장(byte v) { } static void 저장(short v) { } static void 저장(char v) { } static void 저장(int v) { } static void 저장(long v) { } static void 저장(float v) { } static void 저장(double v) { } static void 저장(boolean v) { } static void 저장(사과 v) { } static void 저장(사람 v) { } static void 저장(String v) { } } class 사과 { } class 사람 { }
Java
복사
각각의 type을 가진 저장 메서드를 만든다
만들어야할 메서드의 종류가 너무 많아진다
숫자 관련한 메소드 중복 제거하기
//code.oa.gg/java8/965 // 가정 : 우리는 오라클 자바 개발팀에 취업을 했습니다. 우리는 자바 10의 새로운 기능은 `저장소` 클래스를 만들어야 합니다. // 기본형 변수의 경우 자동형변환을 이용하여 `저장 메서드`의 개수를 최대한 줄여보세요.[정답] class Main { public static void main(String[] args) { 저장소.저장(10); 저장소.저장("안녕"); 저장소.저장(new 사람()); 저장소.저장(new 사과()); 저장소.저장(5.5); 저장소.저장(false); 저장소.저장('a'); // 정수 계열 byte b = 0; // 1바이트 char c = 1; // 2바이트 short s = 2; // 2바이트 int i = 3; // 4바이트 long l = 4; // 8바이트 // 실수 계열 // 4.1f => float 형 실수를 의미 float f = 3.14f; // 4바이트 // 3.141592 => double 형 실수를 의미 double d = 3.141592; // 8 바이트 // 논리 계열 boolean bl = false; // 1/8 바이트, 1비트 저장소.저장(b); 저장소.저장(s); 저장소.저장(c); 저장소.저장(i); 저장소.저장(l); 저장소.저장(f); 저장소.저장(d); 저장소.저장(bl); } } class 저장소 { static void 저장(double v) { System.out.println("double 값 : " + v); } static void 저장(boolean v) { System.out.println("boolean 값 : " + v); } static void 저장(String v) { System.out.println("String 값 : " + v); } static void 저장(사람 v) { System.out.println("사람 값 : " + v); } static void 저장(사과 v) { System.out.println("사과 값 : " + v); } } class 사람 { } class 사과 { }
Java
복사
double 타입이 byte, int, long, float 타입을 포함한다
//code.oa.gg/java8/967 // 가정 : 우리는 오라클 자바 개발팀에 취업을 했습니다. 우리는 자바 10의 새로운 기능은 `저장소` 클래스를 만들어야 합니다. // 문제 : 객체를 매개변수로 받는 `저장` 메서드도 최대한 개수를 줄여보세요.[정답] class Main { public static void main(String[] args) { 저장소.저장(10); 저장소.저장("안녕"); 저장소.저장(new 사람()); 저장소.저장(new 사과()); 저장소.저장(5.5); 저장소.저장(false); 저장소.저장('a'); // 정수 계열 byte b = 0; // 1바이트 char c = 1; // 2바이트 short s = 2; // 2바이트 int i = 3; // 4바이트 long l = 4; // 8바이트 // 실수 계열 // 4.1f => float 형 실수를 의미 float f = 3.14f; // 4바이트 // 3.141592 => double 형 실수를 의미 double d = 3.141592; // 8 바이트 // 논리 계열 boolean bl = false; // 1/8 바이트, 1비트 저장소.저장(b); 저장소.저장(s); 저장소.저장(c); 저장소.저장(i); 저장소.저장(l); 저장소.저장(f); 저장소.저장(d); 저장소.저장(bl); } } class 저장소 { static void 저장(double v) { System.out.println("double 값 : " + v); } static void 저장(boolean v) { System.out.println("boolean 값 : " + v); } static void 저장(String v) { System.out.println("String 값 : " + v); } static void 저장(생물 v) { System.out.println("사람 값 : " + v); } } class 사람 extends 생물 { } class 사과 extends 생물 { } class 생물 { }
Java
복사
생물 클래스 생성 후 상속을 통해 사람 클래스와 사과 클래스의 객체를 포함한 메서드를 만들 수 있다
Object 클래스를 활용한 메서드로 상속받는 클래스들을 모두 포함하기
//code.oa.gg/java8/969 // 가정 : 우리는 오라클 자바 개발팀에 취업을 했습니다. 우리는 자바 10의 새로운 기능은 `저장소` 클래스를 만들어야 합니다. // 문제 : 객체를 매개변수로 받는 `저장` 메서드를 1개로 줄여보세요.[정답] class Main { public static void main(String[] args) { 저장소.저장(10); 저장소.저장("안녕"); 저장소.저장(new 사람()); 저장소.저장(new 사과()); 저장소.저장(5.5); 저장소.저장(false); 저장소.저장('a'); // 정수 계열 byte b = 0; // 1바이트 char c = 1; // 2바이트 short s = 2; // 2바이트 int i = 3; // 4바이트 long l = 4; // 8바이트 // 실수 계열 // 4.1f => float 형 실수를 의미 float f = 3.14f; // 4바이트 // 3.141592 => double 형 실수를 의미 double d = 3.141592; // 8 바이트 // 논리 계열 boolean bl = false; // 1/8 바이트, 1비트 저장소.저장(b); 저장소.저장(s); 저장소.저장(c); 저장소.저장(i); 저장소.저장(l); 저장소.저장(f); 저장소.저장(d); 저장소.저장(bl); } } class 저장소 { static void 저장(double v) { System.out.println("double 값 : " + v); } static void 저장(boolean v) { System.out.println("boolean 값 : " + v); } static void 저장(Object v) { System.out.println("Object 값 : " + v); } } class 사람 extends 동물 { } class 동물 extends 생물 { } class 식물 extends 생물 { } class 사과 extends 식물 { } // `extends Object` 는 생략가능하다. class 생물 extends Object { } // 이 세상에 있는 모든 클래스는 Object 클래스의 하위 클래스 이다. // 다시말하면 Object 클래스는 모든 클래스의 최초조상이다.
Java
복사
단, double, boolean은 Object에 포함되지 않는다

래퍼 클래스를 통한 박싱과 언박싱

//code.oa.gg/java8/976 // 문제 : 저장소를 만들고 i의 값을 저장한 후 다시 받아보세요.[정답] class Main { public static void main(String[] args) { int i = 10; // 구현 시작 저장소 a저장소 = new 저장소(); // 수동박싱 버전 Integer iObj = new Integer(i); // 수동박식, 하는이유 : 저장 메서드가 객체만 받기 때문에 a저장소.저장(iObj); Object iObj2 = a저장소.주세요(); iObj = (Integer)iObj2; // 여기서의 수동형변환은 필수이다. 왜 필수인지 아셔야 합니다. i = iObj.intValue(); // 수동언박싱 // 오토박싱 버전, 오토박싱은 다음에 설명드리겠습니다. 지금 일단은 이런게 있다는 것만 알고 넘어가시면 됩니다. a저장소.저장(i); // i 가 자동으로 Integer 객체화 되고, 그 객체의 리모콘이 다시 Object 리모콘화 된다. i = (int)iObj2; // Object 리모콘이 Integer 리모콘으로 바뀌고 또 그게 일반 int 값으로 자동으로 바뀐다.(오토언박싱) // 구현 끝 System.out.println(i); // 출력 : 10 } } class 저장소 { Object data; void 저장(Object o) { data = o; } Object 주세요() { return data; } }
Java
복사
⇒기존의 방식
자바 4까지만 하여도 Object 클래스의 메서드를 사용하려면 수동 박싱과 언박싱이 필요했다
Integer iObj = new Integer(i); → 수동 박싱, 저장 메서드가 객체만 받기 때문에 Integer 클래스를 활용해 박싱해준다
Object iObj = a저장소.주세요();
iObj = (Integer)iObj2; → 수동형변환 : 변수가 정수인지 아닌지 확실히 알 수 없으니까
i = iObj.intValue(); → 수동언박싱
⇒ 현재 방식
오토박싱 수용
a저장소.저장(i);