Difference between revisions of "컴퓨터프로그래밍및실습 (2022년)/0919"

From DISLab
Jump to navigation Jump to search
Line 1: Line 1:
참조 타입. 클래스 1 - constructor, instance field, this
== 데이터 타입 분류 ==
# 기본 타입(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

데이터 타입 분류

  1. 기본 타입(primitive type)
    • 정수 타입
      • byte
      • char
      • short
      • int
      • int
      • long
    • 실수 타입
      • float
      • double
    • 논리 타입
      • boolean
  2. 참조 타입(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 그림 참조
  1. 메소드(method) 영역
    • Java 소스 코드(XXX.java)를 컴파일하여 만들어진 실행 코드(bytecode) (XXX.class)가 적재된 메모리 영역
    • 클래스 로더(class loader)가 class 파일을 읽어 메모리에 올림
    • 상수풀(runtime constant pool), 필대(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(construct) 코드 등 실행에 필요한 바이트코드 및 상수, 전역 변수(클래스 변수, class field)
  2. 힙(heap) 영역
    • 프로그래머가 생명 주기(life time)을 제어할 수 있는 메모리가 위치하는 영역임
    • new 연산자를 이용하여 생성하는 객체
    • 배열, String도 객체이므로 힙에 존재함
    • new 연사자를 호출하여 객체를 생성하면 만들어지고, garbage가 되면 사라짐
  3. 스택(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 문


열거 타입