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);