ex01_string
/*
1. 데이터타입분류
1) 기본타입(premitive type)
정수(byte, char ... int, long), 실수(float, double), 논리(boolean)로 실제 값을 가지고 있는 데이터 타입
2) 참조타입
객체가 저장되어 있는 주소를 참조하고 있는 데이터타입으로 Array(배열), Enum(열거), Class(클래스, 대표적 String), Interface(인터페이스)가 있다.
3) 기본 vs 참조
기본타입은 실제값을 변수에 저장하는 반면에 참조타입은 객체가 저장되어 있는 메모리(힙영역)의 주소를
저장하고 있는 데이터타입이다. 주소를 통해 객체를 참조한다는 의미에서 참조타입이라고 한다.
자바는 문자열을 String이라는 참조타입(class)변수에 저장하기 때문에 String변수를 우선 선언해야 한다.
실제로는 문자열을 String변수에 저장한다는 말은 틀린 말이다. 문자열이 직접 변수에 저장되는 것이 아니라
문자열이 String 객체로 생성되어 있는 Heap메모리 영역에 생성되고 String변수는 String객체가 저장되어 있는
힙영역의 메모리주소를 참조한다.
자바는 문자열리터럴이 동일하다면 String리터럴을 공유하도록 설계되어 있다. 일반적으로 변수에 문자를
저장할 경우에는 문자열 리터럴을 사용하지만 객체 생성연산자인 new를 사용해서 직접 String객체를 생성할
수 있다.
new 객체생성연산자는 힙영역에 새로운 객체를 생성할 때 생성하는 연산자로 "객체생성연산자"라고 한다.
2. 메모리사용영역
1) Stack영역
선언된 변수가 저장되는 메모리영역을 말한다.
2) Heap영역
힙영역은 객체와 배열이 생성(저장)되는 메모리 영역이다. 힙영역에 생성된 객체와 배열은
스택영역의 변수나 다른 객체의 필드에서 참조된다. 참조하는 변수나 필드가 없다면 의미가
없는 객체가 되기 때문에 이런 객체를 쓰레기(garbage)로 취급되고 JVM의 쓰레기수집기(garbage
collector)를 실행시켜서 객체를 힙영역에서 자동으로 제거한다. JVM이 자동으로 삭제해주기
때문에 개발자는 별도의 코드를 작성할 필요가 없다.
3) Method영역
코드에서 사용되는 클래스파일(~.class)들은 클래스로더(class loader)가 읽어서 상수, 필드, 메서드, 생성자등을
구분해서 메서드영역에 저장해둔다. 이 영역은 모든 쓰레드(프로그램)가
공유하는 영역이다.
4) Constant Pool
리터럴이 저장되는 메모리 영역이다.
3.
*/
String str = new String();
ReferenceTypeMain myclass = new ReferenceTypeMain(); // 참조타입
String str1 = new String("홍길동"); // 객체 - 힙영역
String str2 = "홍길동"; // 리터럴 - C.P 영역
String str3 = "홍길동"; // 리터럴 - C.P 영역(여기에서 홍길동이라는 리터럴은 str2와 동일값)
String str4 = new String("홍길동"); // 객체 - 힙영역
str4 = null;
int i1 = 10;
String name1 = "소향";
String name2 = "소향";
String name3 = new String("소향");
String name4 = new String("소향");
// 동등연산자(==, !=)
System.out.println(name1==name2);
System.out.println(name1==name3);
System.out.println();
// 값만 비교할 경우 equals()
System.out.println(name1.equals(name2));
System.out.println(name1.equals(name3));
// 객체의 메모리주소 확인하기 hashCode()
System.out.println(name1.hashCode());
System.out.println(name2.hashCode());
System.out.println(name3.hashCode());
System.out.println(name4.hashCode());
ReferenceTypeMain rt1 = new ReferenceTypeMain();
ReferenceTypeMain rt2 = new ReferenceTypeMain();
System.out.println(rt1.hashCode());
System.out.println(rt2.hashCode());
System.out.println();
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
// 배열의 복사
// 1. 참조타입인 배열
String[][] name = {{"거미","나얼"},{"소향","손흥민","이강인"}};
for(int i=0;i<name.length;i++) {
for(int j=0;j<name[i].length;j++) {
System.out.println("name["+i+"]["+j+"]="+name[i][j]);
}
} System.out.println();
// 2. 배열복사 - 얕은복사(shallow copy)
String[][] name2 = name;
for(int i=0;i<name2.length;i++) {
for(int j=0;j<name2[i].length;j++) {
System.out.println("name2["+i+"]["+j+"]="+name2[i][j]);
}
}
System.out.println("=====");
name[0][0] = "박정현";
name2[1][2] = "김민재";
for(int i=0;i<name.length;i++) {
for(int j=0;j<name[i].length;j++) {
System.out.println("name["+i+"]["+j+"]="+name[i][j]);
}
}
System.out.println();
for(int i=0;i<name2.length;i++) {
for(int j=0;j<name2[i].length;j++) {
System.out.println("name2["+i+"]["+j+"]="+name2[i][j]);
}
}
/*
배열의 복사
참조타입인 배열인 경우, 배열복사가 되면 복사되는 값이 객체의 메모리주소이기 때문에
새 배열의 항목은 이전 배열이 참조하는 객체의 메모리 주소와 동일하다.
이 것을 얕은 복사(shallow copy)라고 한다. 반대로 깊은 복사(deep copy)는 참조하는
객체를 별도로 생성해서 복사하는 것을 말한다.
Array복사
자바에서는 배열을 한번 생성하면 크기를 변경할 수 없기 때문에 더 많은 요소를 저장하려면
보다 큰 배열을 새로 만들고 이전 배열에서 항목값들을 복사해야 한다.
배열간 항목을 복사하려면 for문을 이용하거나 System.arrayCopy(), Arrays.copyOf()메서드를
사용해서 깊은 복사를 하게 한다.
*/
lic static void main(String[] args) {
// 1. 얕은 복사
String[] oldArray = {"java", "array", "copy"};
String[] newArray = oldArray;
oldArray[0] = "python";
System.out.println("old array= ");
for(String o : oldArray) {
System.out.println(o+",");
} System.out.println();
System.out.println("new array= ");
for(String n : newArray) {
System.out.println(n+",");}
System.out.println("\n==========================================================");
// 2. 깊은 복사
// 1) for문
String[] old1 = {"소향", "거미", "나얼"};
String[] new1 = new String[3];
for(int i=0; i<old1.length; i++) {
new1[i] = old1[i];
}
old1[0] = "손흥민";
System.out.println("old array= ");
for(String o : old1) {
System.out.println(o+",");
} System.out.println();
System.out.println("new array= ");
for(String n : new1) {
System.out.println(n+",");}
System.out.println("\n==========================================================");
// 2) System.arrayCopy(old, old시작, new, new시작, old크기)이용
String[] old2 = {"소향", "거미", "나얼"};
String[] new2 = new String[6];
System.arraycopy(old2, 0, new2, 0, old2.length);
new2[0] = "김민재";
new2[3] = "BTS";
new2[4] = "BlackPink";
new2[5] = "NewJeans";
System.out.println("old array= ");
for(String o : old2) {
System.out.println(o+",");
} System.out.println();
System.out.println("new array= ");
for(String n : new2) {
System.out.println(n+",");}
System.out.println("\n==========================================================");
// 3) Arrays.copyOf(src, new.length)이용
int[] old3 = {1,2,3,4,5};
int[] new3 = Arrays.copyOf(old3, 3);
System.out.println("old array= ");
for(int o : old3) {
System.out.println(o+",");
} System.out.println();
System.out.println("new array= ");
for(int n : new3) {
System.out.println(n+",");}
System.out.println("\n==========================================================");
// 4) Arrays. copyOfRange(src, start, end-1);
int[] new4 = Arrays.copyOfRange(old3,1,4);
System.out.println("new array= ");
for(int n : new4) {
System.out.println(n+",");}
System.out.println("\n==========================================================");
/*
1. 배열이란
변수는 한개의 값만 저장할 수 있다. 하지만 저장할 데이터 수가 많아지면 그 수 만큼의 변수가
필요하게 된다. 이런 방법을 비효율적이고 번거로운 코딩이 된다. 동일 타입의 많은 양의 데이
터를 사용할 경우 좀 더 효율적인 방법으로 데이터를 저장할 필요가 있는데 이런 방법을 지원
하는 것이 배열(Array)이다.
자바에서는 배열은 동일 데이터 타입의 데이터를 연속된 공간에 배치시키고 각 데이터의 요소에
인덱스를 부여해서 저장하는 자료구조이다.
2. 배열의 선언방법
배열의 선언방법은 2가지가 있다.
1) 데이터타입[] 변수명 -> 관례
2) 데이터타입 변수명[]
대괄호([])는 배열을 선언하는 기호가 된다. 대괄호는 데이터타입 뒤에 또는 변수명 뒤에 선언할
수 있다. 배열은 참조타입 즉, 객체이기 때문에 배열이 생성될 때 객체는 힙메모리 영역에 생성
되고 배열변수는 스택영역에 생성되어 이 변수는 배열 객체가 저장되어 있는 힙영역의 메모리주소
를 참조하게 된다. 참조할 배열객체가 없다면 배열변수는 null값으로 초기화할 수 있다.
3. 배열의 생성방법
1) 값 목록으로 생성하는 방법
int[] scores = {값1,...값n}; 와 같이 중괄호{}안에 값의 항목(요소, element)을 가지는 객체로
생성하는 방법
2) new연산자로 생성하는 방법
int[] scores = new int[5]; 와 같이 new객체 생성연산자로 생성할 수 있다. new 연산자로 생성된
배열은 기본값으로 참조타입은 null, 기본타입은 해당 데이터타입별로 해당요소에 초기값이 저장되기 때문에
배열을 생성한 후에 값을 저장해야 한다.
값이 저장되지 않은 배열의 요소에 접근하려면 NullPointerException이 발생된다. 값을 저장하려면
scores[0] = 100; 와 같이 대입연산자를 이용하여 해당 요소에 값을 저장하게 된다.
4. 배열의 제약사항
1) 배열의 크기(길이)는 한번 정의가 되면 변경할 수 없다. 즉, 고정되어 있다.
2) 동일타입의 데이터만 저장할 수 있따.
3) 배열의 선언은 대괄호[]로 선언한다.
4) 배열의 접근은 index로 접근한다.
5) index는 0부터 시작한다.
*/
// 1. 배열의 초기화 및 생성
int[] scores = {90,95,88,90,89,100,99,78,66,65,88,99};
// 1) 힙영역의 메모리주소
System.out.println(scores); // 메모리주소 : 16진수
System.out.println(scores.hashCode()); // 메모리주소 : 10진수
System.out.println(scores.toString()); // 메모리주소 : 문자열(16진수)
System.out.println();
// 2) index : 접근방법
System.out.println(scores[0]);
System.out.println(scores[1]);
// System.out.println(scores[-1]); // 에러 : 음수는 허용불가
System.out.println();
// 3)length
System.out.println("배열의크기= " +scores.length);
// scores.length = 10; // 배열의 크기느 length속성은 읽기 전용
// 4) for문과 array
int sum=0;
for(int i=0;i<scores.length;i++) {
System.out.println("scores["+i+"]="+scores[i]);
sum += scores[i];
}System.out.println("배열요소의 합계= "+ sum + "\n");
System.out.println("배열요소의 평균= "+ (sum/scores.length) + "\n");
sum = 0;
for(int score:scores) {
sum += score;
}System.out.println("배열요소의 합계= "+ sum + "\n");
System.out.println("배열요소의 평균= "+ (sum/scores.length) + "\n");
// 2. new 연산자 - 배열선언 및 초기화
int scores[]; // 배열의 선언만 되어있고, 크기, 값 등은 선언되어 있지 않다.
// System.out.println(scores[0]); // not have been initialized
scores = new int[] {90,95,88,90,89,100,99,78,66,65,88,99};
int sum = 0;
for(int score:scores) {
sum += score;
}System.out.println("배열요소의 합계= "+ sum + "\n");
System.out.println("배열요소의 평균= "+ (sum/scores.length) + "\n");
// 3. 메서드를 이용한 배열처리
int tot = total(scores);
System.out.println("배열요소의 합계= "+ tot + "\n");
System.out.println("배열요소의 평균= "+ (tot/scores.length) + "\n");
xxx();// static안에서 메서드를 사용하려면 static 붙여야한다
}
static void xxx() {}
public static int total(int[] scores){
int tot = 0;
for(int score : scores) {
tot += score;
}
return tot;
// ~.java -> javac.exe -> ~.class -> java.exe 실행
// 외부에 ~.class 파일을 실행하기 위해서는 c:\yourfolder\java.exe 클래스실행파일
// 예를 들어 덧셈연산을 하는 클래스 실행파일이 있을 겨우에 외부에서 2개의 피연산자를 전달해주어
// 야 한다. 일반적으로 메서드를 호출할 때 매개변수으 ㅣ갯수 만큼 전달하는 것처럼 ~.class파일에 매
// 개 변수를 전달하는 것은 배열로 전달된다.
// 외부에서 매개변수를 전달하는 방법은 'c:\yourfolder\java 클래스실행파일 값1 ... 값n'
int[] val = {1,2};
System.out.println("val[0] + val[1]= " +(val[0] + val[1]));
System.out.println(args.length);
System.out.println("args[0] + args[1]= " +(args[0] + args[1]));
System.out.println("args[0] + args[1]= " +(Integer.parseInt(args[0]) + Integer.parseInt(args[1])));
System.out.println();
int sum = 0;
for(String arg : args) {
sum += Integer.parseInt(arg);
} System.out.println("1~10까지 합 = " +sum);
// 자바에서는 다차원배열을 선언할 수 있다.
// 다차원배열은 정방형과 비정방형의 배열을 선언할 수 있다.
// 1. 2행 3열배열 선언하기
int [][] mathScores = new int[2][3];
// 배열의 크기 확인
System.out.println("1차원 배열의 크기 = " + mathScores.length);
System.out.println("2차원 배열의 첫 번째 배열의 크기 = " + mathScores[0].length );
System.out.println("2차원 배열의 두 번째 배열의 크기 = " + mathScores[1].length );
System.out.println();
// 2. 정방형배열의 for문
for(int i=0;i<mathScores.length;i++){
for(int j=0;j<mathScores[i].length;j++){
System.out.println("mathScore["+i+"]["+j+"]");
}
}System.out.println();
// 3. 비정방형 배열
int[][] engScores = new int[3][];
System.out.println("1차원 배열의 크기 = " + engScores.length);
// System.out.println("2차원 배열의 첫 번째 배열의 크기 = " + engScores[0].length);
// System.out.println("2차원 배열의 두 번째 배열의 크기 = " + engScores[1].length);
engScores[0] = new int[2];
engScores[1] = new int[5];
engScores[2] = new int[1];
System.out.println("2차원 배열의 첫 번째 배열의 크기 = " + engScores[0].length);
System.out.println("2차원 배열의 첫 번째 배열의 크기 = " + engScores[1].length);
System.out.println("2차원 배열의 첫 번째 배열의 크기 = " + engScores[2].length);
System.out.println();
for(int i=0;i<engScores.length;i++){
for(int j=0;j<engScores[i].length;j++){
System.out.println("engScore["+i+"]["+j+"]");
}
}
ex03_enum
String str = new String("소향");
// Week today = new Week(); enum은 객체를 생성할 수 없다.(객체화, 인스턴스화를 할 수 없다)
// Week 열거타입을 선언했다면 열거타입을 호출해서 사용할 수 있다.
// 열거타입은 하나의 데이터타입(참조타입, 사용자가 정의한 새로운 데이터타입)이므로 변수로
// 선언하고 사용해야 한다. 열거타입변수를 선언했다면 열거상수를 저장하거나 사용할 수 있다.
// 열거상수는 단독으로 사용할 수 없고 "열거타입.열거상수"형태로 사용해야 한다.
// 즉, Week.MONDAY의 형태로 사용해야 한다.
Week today = null;
System.out.println(today.MONDAY);
// 현재의 요일을 확인하기
// Calendar를 이용하여 날짜를 제어할 수 있다. Calendar는 String이나 System처럼 기본 클래스이다.
Calendar cal = Calendar.getInstance(); // new연산자를 사용하지 않고 getInstance()메서드로 객체화한다.
System.out.println(cal.toString());
System.out.println(cal.get(Calendar.DAY_OF_WEEK)); // DAY_OF_WEEK는 현재의 요일을 int로 리턴
// 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;
} System.out.println("오늘의 요일 : " +today+" ");
// 사원테이블에서 주민번호 7번째로 남, 여를 구분
int gender = 1; // 예를 들어 7번째 값을 가져왔다.
if(gender==1||gender==3) {
System.out.println("이 사원의 성별은 "+Gender.남자+"입니다");
}
/*
열거타입
데이터중에는 특정의 한정된 값만 갖는 경우가 많다. 예를 들어 요일에 대한
데이터는 "월~일"이라는 7개의 값만을, 계절은 "봄~겨울"이라는 4개의 한정된 값만
가지는 것처럼 한정된 값만 갖는 데이터를 Java에서는 "열거타입 Enumeration Type,
enum"이라고 한다.
열거타입을 선언하기 위해서는 먼저 열거타입의 이름을 정의하고 열거타입이름의 소스
파일(~.java)을 생성해야 한다.
열거타입의 이름은 관례적으로 첫글자는 대문자로 하고 나머지는 소문자로 한다. 만약
여러 단어로 구성된 이름이라면 단어릐 첫글자는 대문자로 한다.
열거타입의 값은 상수의 성격을 가지기 때문에 상수를 선언하는 방법처럼 모두 대문자로
하고 단어의 연결은 언더바(_) 즉, 스네이크케이스를 따른다.
*/
'일 > JAVA' 카테고리의 다른 글
java05.class.member (0) | 2023.05.24 |
---|---|
java05.class.class (0) | 2023.05.24 |
java03. if_for (0) | 2023.05.24 |
java02. operators (0) | 2023.05.23 |
java01. varibles (0) | 2023.05.23 |