Difference between revisions of "컴퓨터프로그래밍및실습 (2022년)/0919"
Jump to navigation
Jump to search
m (Swpark moved page 컴퓨터프로그래밍및실습 (2022년)/0922 to 컴퓨터프로그래밍및실습 (2022년)/참조 타입) |
|||
Line 1: | Line 1: | ||
참조 타입. | == 데이터 타입 분류 == | ||
# 기본 타입(primitive type) | |||
#* 정수 타입 | |||
#** byte | |||
#** char | |||
#** short | |||
#** int | |||
#** int | |||
#** long | |||
#* 실수 타입 | |||
#** float | |||
#** double | |||
#* 논리 타입 | |||
#** boolean | |||
# 참조 타입(reference type) | |||
#* 배열 타입(array type) | |||
#* 열거 타입(enumeration type) | |||
#* 클래스(class) | |||
#* 인터페이스(interface) | |||
<syntaxhighlight lang="java"> | |||
// 기본 타입 변수 | |||
int age = 25; | |||
double price = 100.5 | |||
// 참조 타입 변수(reference type variable) | |||
String name = "신용권"; // 객체는 힙(heap) 영역에 존재한다. | |||
String hobby = "독서"; | |||
</syntaxhighlight> | |||
* 참조 변수인 name에는 "신용권" 객체가 저장되어 있는 메모리의 주소가 저장되어 있다. | |||
* 교재 p.139 그림 참조 | |||
== 메모리 사용 영역 == | == 메모리 사용 영역 == | ||
* 교재 p.140 그림 참조 | |||
# 메소드(method) 영역 | |||
#* Java 소스 코드(XXX.java)를 컴파일하여 만들어진 실행 코드(bytecode) (XXX.class)가 적재된 메모리 영역 | |||
#* 클래스 로더(class loader)가 class 파일을 읽어 메모리에 올림 | |||
#* 상수풀(runtime constant pool), 필대(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(construct) 코드 등 실행에 필요한 바이트코드 및 상수, 전역 변수(클래스 변수, class field) | |||
# 힙(heap) 영역 | |||
#* 프로그래머가 생명 주기(life time)을 제어할 수 있는 메모리가 위치하는 영역임 | |||
#* new 연산자를 이용하여 생성하는 객체 | |||
#* 배열, String도 객체이므로 힙에 존재함 | |||
#* new 연사자를 호출하여 객체를 생성하면 만들어지고, garbage가 되면 사라짐 | |||
# 스택(stack) 영역 | |||
#* 스택 영역은 스레드 마다 독립적으로 존재함 | |||
#* 특별히 스레드를 만들지 않았다면 main 메소드가 실행되고 있는 main 스레드만 존재하므로 스택 영역도 하나임 | |||
#* 메소드의 인자, 지역 변수(local variable), 리턴 값, 리턴 주소가 저장됨. 이를 activation record라 부름. | |||
#* p.142 그림 참조 | |||
* 아래 코드에서 (1), (2), (3) 지점에서의 스택 영역의 형태는? | |||
<syntaxhighlight lang="java"> | |||
char v1 = 'A'; // (1) | |||
if (v1 == 'A') { // (2) | |||
int v2 = 100; | |||
double v3 = 3.14; | |||
} | |||
boolean v4 = true; // (3) | |||
</syntaxhighlight> | |||
== 참조 변수의 <nowikI>==</nowiki>, <nowiki>!=</nowiki> 연산 == | == 참조 변수의 <nowikI>==</nowiki>, <nowiki>!=</nowiki> 연산 == | ||
* 교재 p.143 그림 참조 | |||
<syntaxhighlight lang="java"> | |||
refVar1 = 객체_1; | |||
refVar2 = 객체_2; | |||
refVar3 = 객체_2; | |||
refVar1 == refVar2 // 결과 : false | |||
refVar1 != refVar2 // 결과 : true | |||
refVar2 == refVar3 // 결과 : true | |||
refVar2 != refVar3 // 결과 : false | |||
</syntaxhighlight> | |||
== null과 NullPointerException == | == null과 NullPointerException == | ||
<syntaxhighlight lang="java"> | |||
refVar1 = 객체_1; | |||
refVar2 = null; | |||
refVar1 == null // 결과 : false | |||
refVar1 != null // 결과 : true | |||
refVar2 == null // 결과 : true | |||
refVar2 != null // 결과 : false | |||
int[] intArray = null; | |||
intArray[0] = 10; // NullPointerException 발생 | |||
String str = null; | |||
System.out.println("총 문자수 : " + str.length()); // NullPointerException 발생 | |||
</syntaxhighlight> | |||
== String 타입 == | == String 타입 == | ||
* String은 상수 객체이다. 왜냐하면 String에는 자신이 가진 값을 변경하는 메소드가 없기 때문이다. | |||
<syntaxhighlight lang="java"> | |||
String 변수 = "문자열"; | |||
String name; | |||
name = "신용권"; | |||
String hobby = "자바"; | |||
hobby = null; // garbage가 된다. | |||
String name1 = "신용권"; | |||
String name2 = "신용권"; // 리터럴이 동일하면 동일한 객체를 가리킴 | |||
name1 = "신민철"; | |||
name2 = "신민철"; | |||
String name3 = new String("신민철"); | |||
boolean result = name1 == name2; // true | |||
result = name1 == name3; // false | |||
result = name1.equals(name3); // true; | |||
</syntaxhighlight> | |||
== 배열 타입 == | == 배열 타입 == | ||
* 동일한 타입을 여러 개 만들어야 할 때 | |||
=== 배열이라? === | |||
* 다음은 성가시다. | |||
<syntaxhighlight lang="java"> | |||
int score1 = 83; | |||
int score2 = 90; | |||
int score3 = 87; | |||
int score4 = 99; | |||
int score5 = 48; | |||
int score6 = 21; | |||
int score7 = 38; | |||
int score8 = 83; | |||
int score9 = 78; | |||
int score10 = 92; | |||
int score11 = 95; | |||
int score12 = 29; | |||
int score13 = 55; | |||
int score14 = 66; | |||
int score15 = 88; | |||
int score16 = 77; | |||
int score17 = 44; | |||
int score18 = 34; | |||
int score19 = 84; | |||
int score20 = 81; | |||
int score21 = 60; | |||
int score22 = 85; | |||
int score23 = 44; | |||
int score24 = 23; | |||
int score25 = 84; | |||
int score26 = 48; | |||
int score27 = 40; | |||
int score28 = 58; | |||
int score29 = 78; | |||
int score30 = 75; | |||
</syntaxhighlight> | |||
* 평균을 구하고자 한다면 코드를 어떻게 작성해야 하나? | |||
<syntaxhighlight lang="java"> | |||
int sum = score1; | |||
sum += score2; | |||
sum += score3; | |||
sum += score4; | |||
sum += score5; | |||
sum += score6; | |||
sum += score7; | |||
sum += score8; | |||
sum += score9; | |||
sum += score10; | |||
sum += score11; | |||
sum += score12; | |||
sum += score13; | |||
sum += score14; | |||
sum += score15; | |||
sum += score16; | |||
sum += score17; | |||
sum += score18; | |||
sum += score19; | |||
sum += score20; | |||
sum += score21; | |||
sum += score22; | |||
sum += score23; | |||
sum += score24; | |||
sum += score25; | |||
sum += score26; | |||
sum += score27; | |||
sum += score28; | |||
sum += score29; | |||
sum += score30; | |||
int avg = sum / 30; | |||
</syntaxhighlight> | |||
* 얼마나 번거러운가? 아래와 같이 바꿔보자. | |||
<syntaxhighlight lang="java"> | |||
// score는 배열이다. | |||
int[] score = {83, 90, 87, 99, 48, 21, 38, 83, 78, 92, 95, 29, 55, 66, 88, 77, 44, 34, 84, 81, 60, 85, 44, 23, 84, 48, 40, 58, 78, 75}; | |||
int sum = 0; | |||
for(int i = 0; i < score.length; i++) // 여기서 score.length는 30 | |||
sum += score[i]; // score[0]는 83, score[1]은 90 ... | |||
int avg = sum / score.length; | |||
</syntaxhighlight> | |||
* 왜 배열이 필요한지 이해가 되는가? | |||
=== 배열 선언 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 값 목록으로 배열 선언 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== new 연산자로 배열 생성 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 배열 길이 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 커맨드 라인(command line) 입력 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 다차원 배열 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 객체를 참조하는 배열 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 배열 복사 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
=== 향상된 for 문 === | |||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
== 열거 타입 == | == 열거 타입 == | ||
<syntaxhighlight lang="java"> | |||
</syntaxhighlight> | |||
[[category:컴퓨터프로그래밍및실습]] |
Revision as of 15:20, 20 July 2022
데이터 타입 분류
- 기본 타입(primitive type)
- 정수 타입
- byte
- char
- short
- int
- int
- long
- 실수 타입
- float
- double
- 논리 타입
- boolean
- 정수 타입
- 참조 타입(reference type)
- 배열 타입(array type)
- 열거 타입(enumeration type)
- 클래스(class)
- 인터페이스(interface)
// 기본 타입 변수
int age = 25;
double price = 100.5
// 참조 타입 변수(reference type variable)
String name = "신용권"; // 객체는 힙(heap) 영역에 존재한다.
String hobby = "독서";
- 참조 변수인 name에는 "신용권" 객체가 저장되어 있는 메모리의 주소가 저장되어 있다.
- 교재 p.139 그림 참조
메모리 사용 영역
- 교재 p.140 그림 참조
- 메소드(method) 영역
- Java 소스 코드(XXX.java)를 컴파일하여 만들어진 실행 코드(bytecode) (XXX.class)가 적재된 메모리 영역
- 클래스 로더(class loader)가 class 파일을 읽어 메모리에 올림
- 상수풀(runtime constant pool), 필대(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(construct) 코드 등 실행에 필요한 바이트코드 및 상수, 전역 변수(클래스 변수, class field)
- 힙(heap) 영역
- 프로그래머가 생명 주기(life time)을 제어할 수 있는 메모리가 위치하는 영역임
- new 연산자를 이용하여 생성하는 객체
- 배열, String도 객체이므로 힙에 존재함
- new 연사자를 호출하여 객체를 생성하면 만들어지고, garbage가 되면 사라짐
- 스택(stack) 영역
- 스택 영역은 스레드 마다 독립적으로 존재함
- 특별히 스레드를 만들지 않았다면 main 메소드가 실행되고 있는 main 스레드만 존재하므로 스택 영역도 하나임
- 메소드의 인자, 지역 변수(local variable), 리턴 값, 리턴 주소가 저장됨. 이를 activation record라 부름.
- p.142 그림 참조
- 아래 코드에서 (1), (2), (3) 지점에서의 스택 영역의 형태는?
char v1 = 'A'; // (1)
if (v1 == 'A') { // (2)
int v2 = 100;
double v3 = 3.14;
}
boolean v4 = true; // (3)
참조 변수의 ==, != 연산
- 교재 p.143 그림 참조
refVar1 = 객체_1;
refVar2 = 객체_2;
refVar3 = 객체_2;
refVar1 == refVar2 // 결과 : false
refVar1 != refVar2 // 결과 : true
refVar2 == refVar3 // 결과 : true
refVar2 != refVar3 // 결과 : false
null과 NullPointerException
refVar1 = 객체_1;
refVar2 = null;
refVar1 == null // 결과 : false
refVar1 != null // 결과 : true
refVar2 == null // 결과 : true
refVar2 != null // 결과 : false
int[] intArray = null;
intArray[0] = 10; // NullPointerException 발생
String str = null;
System.out.println("총 문자수 : " + str.length()); // NullPointerException 발생
String 타입
- String은 상수 객체이다. 왜냐하면 String에는 자신이 가진 값을 변경하는 메소드가 없기 때문이다.
String 변수 = "문자열";
String name;
name = "신용권";
String hobby = "자바";
hobby = null; // garbage가 된다.
String name1 = "신용권";
String name2 = "신용권"; // 리터럴이 동일하면 동일한 객체를 가리킴
name1 = "신민철";
name2 = "신민철";
String name3 = new String("신민철");
boolean result = name1 == name2; // true
result = name1 == name3; // false
result = name1.equals(name3); // true;
배열 타입
- 동일한 타입을 여러 개 만들어야 할 때
배열이라?
- 다음은 성가시다.
int score1 = 83;
int score2 = 90;
int score3 = 87;
int score4 = 99;
int score5 = 48;
int score6 = 21;
int score7 = 38;
int score8 = 83;
int score9 = 78;
int score10 = 92;
int score11 = 95;
int score12 = 29;
int score13 = 55;
int score14 = 66;
int score15 = 88;
int score16 = 77;
int score17 = 44;
int score18 = 34;
int score19 = 84;
int score20 = 81;
int score21 = 60;
int score22 = 85;
int score23 = 44;
int score24 = 23;
int score25 = 84;
int score26 = 48;
int score27 = 40;
int score28 = 58;
int score29 = 78;
int score30 = 75;
- 평균을 구하고자 한다면 코드를 어떻게 작성해야 하나?
int sum = score1;
sum += score2;
sum += score3;
sum += score4;
sum += score5;
sum += score6;
sum += score7;
sum += score8;
sum += score9;
sum += score10;
sum += score11;
sum += score12;
sum += score13;
sum += score14;
sum += score15;
sum += score16;
sum += score17;
sum += score18;
sum += score19;
sum += score20;
sum += score21;
sum += score22;
sum += score23;
sum += score24;
sum += score25;
sum += score26;
sum += score27;
sum += score28;
sum += score29;
sum += score30;
int avg = sum / 30;
- 얼마나 번거러운가? 아래와 같이 바꿔보자.
// score는 배열이다.
int[] score = {83, 90, 87, 99, 48, 21, 38, 83, 78, 92, 95, 29, 55, 66, 88, 77, 44, 34, 84, 81, 60, 85, 44, 23, 84, 48, 40, 58, 78, 75};
int sum = 0;
for(int i = 0; i < score.length; i++) // 여기서 score.length는 30
sum += score[i]; // score[0]는 83, score[1]은 90 ...
int avg = sum / score.length;
- 왜 배열이 필요한지 이해가 되는가?
배열 선언
값 목록으로 배열 선언
new 연산자로 배열 생성
배열 길이
커맨드 라인(command line) 입력
다차원 배열
객체를 참조하는 배열
배열 복사
향상된 for 문