JAVA
기본 타입 (Primary Type)
: 정수 타입 (byte,char,short,int,long)
: 실수 타입 (float,double)
: 논리 타입 (boolean)
EX)
기본타입 (스택이라는 메모리 영역에 저장)
int age = 25;
double price = 100.5;
참조타입 (reference Type)
: 배열 타입
: 열거 타입
: 클래스
: 인터페이스
EX)
참조타입 (힙 메모리 영역에 저장된 값을 참조해 사용)
String name = "지코";
String hobby = "독서";
대채적으로 타입형의 첫글자를 기본타입은 소문자로 참조타입은 대문자로 표기한다.
데이터와 메소드로 구성된 덩어리
객체 = 데이터(필드) + 메소드
// 변수 선언
int [] arr1;
int [] arr2;
int [] arr3;
// 변수 대입
arr1 = new int[] {1,2,3}; // 힙 영역에 배열객체 생성
arr2 = new int[] {1,2,3}; // 힙 영역에 배열객체 생성
arr3 = arr2;
// 같은 배열 참조하는지 검사
System.out.println(arr1 == arr2); // false (주소가 다르다)
System.out.println(arr2 == arr3); // true (주소가 같다)
참조타입 변수가 아직 번지를 저장하지 않았다는 뜻
초기값으로 사용 가능하며 스택영역에 저장된다.
NULL 값을 출력할 수 있다
하지만 변수가 NULL인 상태에서 객체의 데이터나 메소드를 사용하려 할때
예외(NullPointerException)가 발생한다.
EX)
String str = null;
// 자바에서 String 객체인 경우 리터럴 값이 같으면 같은 주소를 참조
String name1 = "신밧드";
String name2 = "신밧드";
System.out.println(name1 == name2); // true
// new를 사용하면 새로운 주소를 생성한다.
String str1 = new String("신밧드");
String str2 = new String("신밧드");
System.out.println(str1 == str2); // false
System.out.println(name1.equals(str2)); // true
자바에서는 new를 생성시에 각자의 주소가 다르기때문에 문자열의값이 같더라도 false로 표기된다.
// 문자열 부분 값
String str = "자바 프로그래밍";
char value = str.charAt(3);
System.out.println(value); // 프
// 문자열 길이 값
int ln = str.length();
System.out.println(ln); // 8
// 문자열 치환
String newStr = str.replace("자바", "JAVA");
System.out.println(newStr); // JAVA 프로그래밍
// 문자열 범위 값
String ssn = "123456-7654321";
String fNum = ssn.substring(0, 6);
String lNum = ssn.substring(7);
System.out.println(fNum + " : " + lNum); // 123456 : 7654321
// 문자열 주소값
int i = str.indexOf("자바");
System.out.println(i); // 0
int i1 = str.indexOf("자바", 5);
System.out.println(i1); // 9
// 문자열 나누기
String board = "1, 자바학습, 참조타입, 홍길동";
String[] S = board.split(",");
System.out.println(S[0] + S[1] + S[2] + S[3]); // 1 자바학습 참조타입 홍길동
- 다른표현
for (i = 0; i < S.length; i++) {
// 1 자바학습 참조타입 홍길동
System.out.print(S[i]);
문자값의 부분 값을 출력하는 charAt
문자열의 길이 값을 구하는 length
문자를 다른 값으로 치환해주는 replace
문자열의 범위 값을 구하는 substring
문자열 주소값을구하는 indexOf
문자열을 나누는 split 등등이 있다.
자주 사용하므로 숙지!!
: 같은 형의 변수를 줄여주기 위해 사용한다.
: 같은 타입의 값만 관리한다.
: 배열의 길이는 늘리거나 줄일 수 없다.
문자형 배열
String [] str = {"봄", "여름", "가을", "겨울"};
String s = str [0];
System.out.println(s); // 봄
str[0] = "Spring";
System.out.println(str[0]); // Spring
System.out.println(str); // [Ljava.lang.String;@49e4cb85(오브젝트 명)
System.out.println(str.length); // 4
System.out.println(str[0].length()); // 6 (Spring)
정수형 배열
// 방법 1
int [] kor = {100, 99, 88, 30, 55};
// 방법 2
int [] kor ;
kor = new int [] {100, 99, 88, 30, 55};
int sum = 0;
for (int i : kor) {
sum += i;
}
// 나누기를 할때는 실수화
double avg = (double)sum / kor.length;
System.out.println("합: "+ sum +" 평균: " + avg); // 합:372 평균:74.4
정수형과 문자형 배열의 표기법과 값을 구해보았다.
데이터 형의 일치가 중요하다.
package ch01;
public class test0523 {
public static void main(String[] args) {
printItem(new int[] {100, 99, 88, 30, 55});
}
public static void printItem(int[] kor) {
// 인덱스 안의 범위 값으로 설정해야한다.
for (int i = 0; i < 5; i++) {
System.out.print(kor[i] + " ");
}
}
}
메소드 안에 메소드를 사용할수는 없다.
값을 받아와 선언한 printItem 메소드 안에서 매개값을 받아 항목을 출력하는 코드이다.
package ch01;
public class test0523 {
public static void main(String[] args) {
// 이차원 배열
// 사용 방법 : run as > run configurations > class파일 > arguments > 값입력 후 Run
// 우리 나라 대한 민국 입력
System.out.print(args[0] + " "); // 우리
System.out.print(args[1] + " ");// 나라
System.out.print(args[2]); // 대한
}
}
arguments에 입력한 값을 주소값으로 하나씩 출력한다.
이차원 배열 값 입력
// 방법 1
int [] [] s1 = new int [2][3];
// 방법 2
int [] [] s2 = {{80, 90},{70, 60}};
이차원 배열 (서로 다른 형은 입력 불가)
int [] [] kor = {{80, 90, 88},{77,65}};
System.out.println(kor[0][1]); // 90
System.out.println(kor[1][1]); // 65
//데이터 형이 다르기에 Error
int [] [] err = {{80, 90, 88},{77,65},{"하나", "둘"}};
// 이차원 배열 길이
System.out.println(kor.length); // 2 (kor 배열 묶음 갯수)
System.out.println(kor[0].length); // 3 (kor 배열 첫번째 묶음 항목갯수)
System.out.println(kor[1].length); // 2 (kor 배열 두번째 묶음 항목갯수)
다차원 배열(이차원 배열) 을 작성하여 배열의 길이와 값을 구해오는 방법을 알아봤다.
데이터 형을 주의하면서 작성하자
예제 1. 학과별 총합 평균구하기
int [] [] kor = {{80, 90, 88},{77,65},{99,100,94,77}};
int sum=0; int c=0;
for (int i=0; i < kor.length; i++){
for (int j=0; j < kor[i].length; j++){
c+=1;
sum += kor[i][j];
}
}
double avg = sum / c;
System.out.println("학과 총합: "+ sum + ", 학과 평균: " + avg);
예제 2. 마지막 배열부터 항목 순서대로 출력
int l1=kor.length-1;
for (int i= l1; i>=0; i--) {
for (int j=0; j < kor[i].length; j++){
System.out.print(kor[i][j] + " ");
}
System.out.println();
}
값이 일정하게 정해져있거나 변동이 없을때에 사용한다.
package ch01;
public enum Week {
// 열거상수목록 ( 한정된 값 목록)
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
enum 파일에 열거상수(요일)를 입력한 뒤
package ch01;
public class test0523 {
public static void main(String[] args) {
// 열거상수 불러오기
Week week = Week.SUNDAY;
System.out.print("요일: "+ week); // 요일 : SUNDAY
}
}
Class 파일에서불러와 출력이 가능하다.
// 자바 유틸 패키지 불러오기
import java.util.Calendar;
// 캘린더 만들기
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
// 월은 +1을 해준다.
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DAY_OF_MONTH);
// 요일은 일~ 월 순 1~7로 표기된다.
int week = now.get(Calendar.DAY_OF_WEEK);
int hour = now.get(Calendar.HOUR);
int min = now.get(Calendar.MINUTE);
int sec = now.get(Calendar.SECOND);
System.out.print(year + "년, ");
System.out.print(month + "월, ");
System.out.print(day + "일, ");
System.out.print(week + " : 수요일, ");
System.out.print(hour + "시, ");
System.out.print(min + "분, ");
System.out.print(sec + "초 ");