


int age = 25;
double price = 100.5;
String name = "신용권";
String name = "독서";
| 메소드 영역 | 바이트코드 파일을 읽은 내용이 저장되는 영역 클래스별로 상수, 정적 필드, 메소드 등이 저장된다. ( 바이트코드 파일 내용 저장소) |
|---|

| 힙 영역 | 객체가 생성되는 영역이며 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조할 수 있다. |
|---|

| 스택영역 | 메소드를 호출시 생성되는 프레임이 저장되는 영역이며 호출이 끝나면 프레임은 자동적으로 제거된다. 여기에서 기본, 참조 타입 변수가 생성되고 제거되며 프레임 내부에는 로컬 변수 스택이 있다. |
|---|

아래와 같이 참조하고 있다면 연산결과는..
스택영역 힙 영역 refVar1 객체1 refVar2 객체2 refVar3 객체2 refVar1 == refVar2 // 결과 : fasle refVar1 != refVar2 // 결과 : true refVar2 == refVar3 //결과 : true refVar2 != refVar3 // 결과 : false
"==" , "!=" 연산자로 객체를 비교하는 코드는 if문에서 많이 사용된다.
if ( refVar2 == refVar3 ) {...}
String refVar1 = "자바";
String refVar2 = null;
refVar1 == null // false
refVar2 == null // true
refVar1 != null // true
refVar2 != null // false
참조 변수를 사용하면서 가장 많이 마주하는게 NullPointExeception다. 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려 할 때 이 예외가 발생한다.
int[] intArray = null; intArrayy[0] = 10; // 배열 객체가 없으므로 10을 저장할 수 없기 때문에 오류 String str = null; System.out.println(" 총 문자 수 : " + str.length()); // str변수가 참조하는 String 객체가 없으므로 길이를 구할 수 없어 오류
String hobby = "여행";
hobby = null; // "여행"에 해당되는 String 객체는 쓰레기가 됨
String kind1 = "자동차";
String kind2 = kind1; /// kind1 변수에 저장되어 있는 번지를 kind2 변수에 대입
kind1 = null; // 자동차에 해당되는 String 객체는 쓰레기가 아님
System.out.println("kind2 : " + kind2);
String name1 = "홍길동";
String name2 = "홍길동"; // 같은 String 객체에 번지가 저장된다.
String name1 = new String("홍길동");
String name2 = new String("홍길동");
new 연산자로 생성하면 서로 다른 String 객체의 번지를 가지게 되기 때문에, 문자열 리터럴로 생성하느냐 new 연산자로 생성하느냐에 따라 비교 연산자의 결과가 달라질 수 있다.
String name 1 ="홍길동"; String name 2 ="홍길동"; String name 3 =new String("홍길동"); name1==name2 // true name2==name3 // false
boolean result = str1.equals(str2);
boolean result = !str1.equals(str2);
위 내용들의 전체적 예시.
String strVar1 = "홍길동"; String strVar2 = "홍길동"; if(strVar1 == strVar2 ) { System.out.println("strVar1과 strVar2는 참조가 같다"); } else { System.out.println("strVar1과 strVar2는 참조가 다르다"); } if(strVar1.equals(strVar2)) { System.out.println("strVar1과 strVar2는 문자열이 같다"); } else { System.out.println("strVar1과 strVar2는 문자열이 다르다."); } String strVar3 = new String("홍길동"); String strVar4 = new String("홍길동"); if (strVar3 == strVar4) { System.out.println("strVar3과 strVar4는 참조가 같다"); } else { System.out.println("strVar3과 strVar4는 참조가 다르다."); } if (strVar3.equals(strVar4)) { System.out.println("strVar3과 strVar4는 문자열이 같다"); } else { System.out.println("strVar3과 strVar4는 문자열이 다르다."); }출력 결과는
strVar1과 strVar2는 참조가 같다
strVar1과 strVar2는 문자열이 같다
strVar3과 strVar4는 참조가 다르다.
strVar3과 strVar4는 문자열이 같다(" ") 빈 문자열도 대입할 수 있는데 이 경우도 equals() 메소드를 사용한다.
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3) // '프'가 해당된다.
String ssn = "9506241230123";
char sex = ssn.charAt(6);
switch (sex) {
case '1':
case'3':
System.out.println("남자입니다.");
break;
case '2':
case '4':
System.out.println("여자입니다.");
break;
}
String ssn = "9506241230123";
int length = ssn.length(); // length 변수에 ssn의 문자열 길이가 저장됨
if (length == 13) {
System.out.println("주민등록번호 자릿수가 맞습니다.");
} else {
System.out.println("주민등록번호 자릿수가 틀립니다.");
}
String oldStr = "자바 문자열은 불변입니다. 자바 문자열은 String 입니다.";
String newStr = oldStr.replace("자바", "JAVA");
System.out.println(oldStr);
System.out.println(newStr);
| 메소드 | 설명 |
|---|---|
| substring(int beginIndex) | beginIndex에서 끝까지 잘라내기 |
| substring(int beginIndex, int endIndex) | beginIndex에서 endIndex 앞까지 잘라내기 |
String ssn = "880815-1234567";
String firstNum = ssn.substring(0,6 );
System.out.println(firstNum);
String secondNum = ssn.substring(7);
System.out.println(secondNum);
int index = subject.indexOf("프로그래밍");
if(index == 1) {
// 포함이 되어 있는 경우
} else {
//포함이 안되어 있는 경우
}
String subject = "자바 프로그래밍";
int location = subject.indexOf("프로그래밍"); // location 3 저장
System.out.println(location); // 3출력
String substring = subject.substring(location); //3번째부터 짜름 , "프로그래밍"
System.out.println(substring); "프로그래밍" 출력
location = subject.indexOf("자바");
if(location != -1) { // " 자바가 포함되면
System.out.println("자바와 관련된 책이군요.");
} else {
System.out.println("자바와 관련없는 책이군요.");
}
boolean result = subject.contains("자바");
if(result) {
System.out.println("자바와 관련된 책이군요.");
} else {
System.out.println("자바와 관련없는 책이군요.");
}
split() 메소드 호출시 쉼표를 제공하면 분리된 문자열로 배열을 얻을 수 있다.
String board = "1, 자바 학습, 참조 타입 String을 학습합니다., 홍길동";
// 문자열 분리
String[] tokens = board.split(",");
// 인덱스별로 읽기
System.out.println("번호: " + tokens[0]);
System.out.println("제목: " + tokens[1]);
System.out.println("내용: " + tokens[2]);
System.out.println("성명: " + tokens[3]);
System.out.println();
// for문을 이용한 읽기
for (int i=0; i<tokens.length; i++) {
System.out.println(tokens[i]);
}
## 5.6 배열(Array) 타입
#### 변수는 하나의 값만 저장할 수 있다. 저장해야 할 값의 수가 많아지면 그만큼 많은 변수가 필요하다. 책에 있는 예로 30명의 성적을 저장하고 평균값을 구한다고 하면 30명의 성적을 저장하기 위한 변수 30개를 선언해야 한다.
```java
int score1 = 83;
int score2 = 90;
.
.
.
int score30 = 99;
앞의 예에서 30명의 성적은 score 배열로 생성할 수 있다.
인덱스는 대괄호와 함께 사용되며 값을 읽거나 저장하는데 사용된다. score[0] 은 83, score[1] 은 90 이런형식으로. 이렇게 성적을 배열에 저장한다면 평균값은 배열 인덱스를 이용하여 for문으로 쉽게 구할 수 있다.
int sum = 0; for(int i=0; i<=30; i++) { //수 백명의 학생으로 늘어나도 i< 수백명 으로 바꾸면 되기에 간편하다. sum += score[i]; } int avg = sum /30;
타입 [] 변수;
타입 변수[];
// 배열 선언 방법
int[] intArray;
String[] strAraay;
double[] doubleArray;
int intAraay[]
String strArray[]
double doubleArray[]
타입[] 변수 = { 값0, 값1, 값2, 값3, 값, ...};
//사계절 문자열을 갖는 배열
String[] season = { "Winter", "Spring", "Summer", "fall" };
// 이렇게 생성된 배열에서는 "Winter"를 season[0]으로 읽을 수 있다.
// 대입연산자를 통해 배열에 저장되어 있는 값을 바꿀 수 있다.
//배열 변수 선언과 배열 생성
String[] season = { "Spring", "Summer", "Fall", "Winter" };
//배열의 항목값 읽기
System.out.println("season[0] : " + season[0]);
System.out.println("season[1] : " + season[1]);
System.out.println("season[2] : " + season[2]);
System.out.println("season[3] : " + season[3]);
//인덱스 1번 항목의 값 변경
season[1] = "여름";
System.out.println("season[1] : " + season[1] );
System.out.println();
//배열 변수 선언과 배열 생성
int[] scores = { 83, 90 ,87 };
//총합과 평균 구하기
int sum = 0;
for(int i=0; i<=2; i++) {
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double) sum / 3;
System.out.println("평균 : " + avg);
}
}
타입[] 변수;
변수 = { 값0, 값1 ,값2 , ... }; // 컴파일 에러
//변수 = new 타입[] { 값0, 값1, 값2, 값3, ... };
// String 타입이라면 new String[]을 중괄호 앞에 붙여줘야 한다.
String[] names = null;
names = new String[] { "신용권", "홍길동", "김자바" };
//메소드 선언
void printItem(int[] scores) { ... }
//잘못된 메소드 선언
PrintItem( { 95, 85, 90} ); // 컴파일 에러
//올바른 메소드 선언
printItem( new int[] { 95, 85, 90} );
타입[] 변수 = new 타입[길이]
// 변수 선언 후 대입 방법
타입[] 변수 = null;
변수 = new 타입[길이];

int[] scores = new int[30]; // scores[0] ~ scores[29] 의 모든 값은 0으로 초기화 된다.
String[] names = new String[30] // names[0]~name[29] 의 모든 값은 null로 초기화된다.
배열변수.length;
intArray.length = 10; //컴파일 에러 발생
//배열 변수 선언과 배열 대입
int[] scores = { 84, 90, 96 };
//배열 항목의 총합 구하기
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
System.out.println("총합 : " + sum);
//배열 항목의 평균 구하기
double avg = (double) sum / scores.length;
System.out.println("평균 : " + avg);

변수[1차원인덱스][2차원인덱스]...[N차원인덱스]
// 위 그림 값
변수[0][0][0] // 값1
변수[0][1][0] // 값3
변수[1][0][1] // 값6
타입[][] 변수 = {
{값1, 값2, ... }, // 1차원 배열의 0인덱스
{값3, 값4, ... }, // 1차원 배열의 1인덱스
...
};
타입[][] 변수 = new 타입[1차원수][2차원수]; //초기값 정수: 0 ,실수: 0.0 ,논리: false ,참조:null
String[] languages = new String[3];
languages[0] = "Java";
languages[1] = "Java";
languages[2] = new String("Java");
System.out.println( languages[0] == languages[1]); // true 같은 객체 참조
System.out.println( languages[0] == languages[2]); // false 같은 객체 참조X
System.out.println( languages[0].equals(languages[2]) ); //true 문자열이 같음
//길이 3인 배열
int[] oldIntArray = { 1, 2, 3};
//길이 5인 배열을 새로 생성
int[] newIntArray = new int[5];
//배열 항목 복사
for (int i=0; i<oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
//배열 항목 출력
for (int i=0; i<newIntArray.length; i++) {
System.out.print(newIntArray[i] + ", ");
}
배열 복사를 위한 더 간단한 방법이 있는데 System의 arraycopy() 메소드를 이용하면 한 줄만으로 배열 복사가 가능하다.
//길이 3인 배열 String[] oldStrArray = { "Java", "array", "copy" }; //길이 5인 배열 String[] newStrArray = new String[5]; //배열 항목 복사 System.arraycopy(oldStrArray, 0, newStrArray, 0 ,oldStrArray.length); //배열 항목 출력 for(int i=0; i<newStrArray.length; i++) { System.out.print(newStrArray[i] + ", "); }newStrArray 변수가 참조하는 배열의 항목 초기값은 null이므로 복사되지 않은 3번 인덱스와 4번 인덱스 항목은 null을 유지하고 있다. 번지 복사가 되어 참조하는 String 객체는 변함이 없다.

//배열 변수 선언과 배열 생성
int[] scores = { 95, 71, 84, 93, 87 };
//배열 항목 전체 합 구하기
int sum = 0;
for (int score : scores) {
sum = sum + score;
}
System.out.println("점수 총합 = " + sum);
//배열 항목 전체 평균 구하기
double avg = (double) sum / scores.length;
System.out.println("점수 평균 = " + avg);
if(args.length != 2) {
System.out.println("프로그램 입력값이 부족");
System.exit(0);
}
String strNum1 = args[0];
String strNum2 = args[1];
int num1 = Integer.parseInt(strNum1);
int num2 = Integer.parseInt(strNum2);
int result = num1 + num2;
System.out.println(num1 + " + " + num2 + " = " + result);
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
import java.util.Calendar;
public class WeekExample {
public static void main(String[] args) {
//Week 열거 타입 변수 선언
Week today = null;
//Calendar 얻기
Calendar cal = Calendar.getInstance();
//오늘의 요일 얻기(1~7)
int week = cal.get(Calendar.DAY_OF_WEEK);
//숫자를 열거 상수로 변환해서 변수에 대입
switch(week) {
case 1: today = Week.SUNDAY ; break;
case 2: today = Week.MONDAY ; break;
case 3: today = Week.TUESDAY ; break;
case 4: today = Week.WEDNESDAY ; break;
case 5: today = Week.THURSDAY ; break;
case 6: today = Week.FRIDAY ; break;
case 7: today = Week.SATURDAY ; break;
}
//열거 타입 변수를 사용
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합니다.");
} else {
System.out.println("열심히 자바를 공부합니다.");
}
}
}
public static void main(String[] args) {
int max = 0;
int[] array = {1, 5, 3, 8, 2};
for (int i = 0; i < array.length; i++) {
if (max < array[i]) {
max = array[i];
}
System.out.println("max: " + max);
}
}
public static void main(String[] args) {
int[][] array = {
{95, 86},
{83, 92, 96},
{78, 83, 93, 87, 88}
};
int sum = 0;
double avg = 0.0;
int count = 0;
for(int i=0; i<array.length; i++) {
for(int j=0; j<array[i].length; j++) {
sum += array[i][j];
count++;
}
}
avg = (double) sum / count;
System.out.println("sum: " + sum);
System.out.println("avg: " + avg);
}
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
boolean run = true;
int studentNum = 0;
int[] scores = null;
public static void main(String[] args) {
boolean run = true;
int studentNum = 0;
int[] scores = null;
Scanner scanner = new Scanner(System.in);
while (run) {
System.out.println("----------------------------------------------------");
System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
System.out.println("----------------------------------------------------");
System.out.print("선택> ");
int selectNo = scanner.nextInt();
if (selectNo == 1) {
System.out.print("학생수> ");
studentNum = scanner.nextInt();
scores = new int[studentNum];
} else if (selectNo == 2) {
for (int i = 0; i < scores.length; i++) {
System.out.print("scores[" + i + "]> ");
scores[i] = scanner.nextInt();
}
} else if (selectNo == 3) {
for (int i = 0; i < scores.length; i++) {
System.out.println("scores[" + i + "]: " + scores[i]);
}
} else if (selectNo == 4) {
int max = 0;
int sum = 0;
double avg = 0;
for (int i = 0; i < scores.length; i++) {
max = (max < scores[i]) ? scores[i] : max;
sum += scores[i];
}
avg = (double) sum / studentNum;
System.out.println("최고 점수: " + max);
System.out.println("평균 점수: " + avg);
} else if (selectNo == 5) {
run = false;
}
}
System.out.println("프로그램 종료");
}
}