오픈 챌린지
이클립스를 사용하여 OpenChallenge1이라는 이름의 프로젝트를 만들고, 클래스 이름을 MyInfoApp로 하기 및 이름 나이 학과의 정보를 출력해보기
package sample;
public class MyInfoApp {
public static void main(String[] args) {
System.out.println("Do Hyeong Kwon");
System.out.println("23 years old");
System.out.println("Department of Computer Engineering");
이후 간단하게 프로젝트 및 클래스 만드는 방법
파이썬의 ##은 자바의 //
\n은 줄바꿈 \t 프로그램의 지정된 탭의 크기만큼 띄우기
변수값 도출 과정
변수 value 선언
: int value = 20;
변수 value 값을 읽고 10을 더하는 산술 연산을 수행
연산의 결과값을 변수 result의 초기값으로 저장
int result = value + 10;
변수 result 값을 읽고 콘솔에 출력
System.out.println(result);
int value = 20;
int result = value + 10;
System.out.println(result);
int hour = 3;
int minute = 5;
System.out.println(hour + "시간" + minute + "분");
int total = (hour*60) + minute;
System.out.println("총" + total + "분");
30분
3시간 5분
총 185분
2번째 칸의 프린트라인에서 ln를 빼면 줄바꿈없이 한줄에 모든 답이 표출
등호는 오른쪽의 값을 왼쪽으로 넘겨주는 개념 = 대입
int x = 3;
int y = 5;
System.out.println("x:"+ x +", y:"+ y);
int temp = x;
x = y;
System.out.println("x:"+ x +", y:"+ y);
y = temp;
System.out.println("x:"+ x +", y:"+ y);
지정된 변수 값을 다른 값으로 변하는 방법
int v1 = 15;
if(v1>10) {
int v2;
v2 = v1-10;
System.out.println("v1:"+ v1 +", v2:"+ v2);
}
//System.out.println("v1:"+ v1 +", v2:"+ v2); (<-마지막 v2에 오류가 나는 이유는 중괄호 안의 인식 범위를 벗어났기 때문)
int var1 = 0b1011 ; //2진수
int var2 = 0206; //8진수
int var3 = 365;
int var4 = 0xB3; //16진수
System.out.println("var1 : " + var1);
System.out.println("var2 : " + var2);
System.out.println("var3 : " + var3);
System.out.println("var4 : " + var4);
byte var1 = -128;
byte var2 = -30;
byte var3 = 0;
long var4 = 10000000000L;
byte var5 = 127;
//byte var6 = 128;
System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
System.out.println(var5);
//System.out.println(var6);
char var6 = '가'; //65
String var8 = "가나다라";
int var7 = var6;
float v1 = 3.14234234234234f;
double v2 = 3.14234234234234;
//double v3 = 314e-2;
System.out.println(v1);
System.out.println(v2);
boolean v = true;
v = false;
if(v) {
System.out.println(v + "입니다");
}else {
System.out.println("false입니다");
== (같으면?) !=(서로 같지않나요?0)
byte bv = 10;
int intV = bv;
System.out.println("intV : "+ intV); //자동타입 변환
char cV = '가';
intV = cV;
System.out.println("intV : "+ intV);
long longV = intV;
System.out.println("intV : "+ intV);
float floatV = 100.5f;
double doubleV = floatV;
int v11 = 10;
byte byteV = (byte)v11;
double doubleW = 3.14;
int intValue = (int) doubleW;
System.out.println("intValue : "+ intValue);
int str1 = 1 + 2 + 3; //6
String str2 = 1 + 2 + "3"; //33
String str3= 1 + "2" + 3; //123
String str4 = "1" + 2 + 3; //123 문자열 순서
System.out.println(str1 +" "+ str2 + " "+ str3 + " " + str4);
String str = "123";
int value = Integer.parseInt(str); // 문자열을 숫자로 강제 형변환 형식
int val = value + 50;
System.out.println(val);
String s = String.valueOf(31.4);
System.out.printf("이름 : %s\t", "권도형");
System.out.printf("나이 : %d\n", 23);
System.out.printf("이름 : %s , 나이 : $d\n","홍길동",99);
프린트 라인 뿐만 아니라 프린트에프를 사용하여 입력가능
public static void main(String[] args) throws Exception{ //< 메인 메소드에서 익셉션 부분 이것만 예외로 처리
int keyCode;
while(true) {
keyCode = System.in.read(); //< read는 하나씩 체크
System.out.println("keyCode :"+ keyCode);
if(keyCode==113) {
break;
}
}
System.out.println("종료");
int var1 = 1;
int var2 = 3;
int var3 = 2;
int result = (var1 + var2) * var3;
System.out.printf("%d", result); //< 프린트f엔 퍼센트를 사용 및 d의 자리에 리설트 값을 넣음
int result = 0;
result += 10; // result = result+10; 이란 형식과 같다
System.out.println("result = " + result);
result -= 5;
System.out.println("result = " + result);
result *= 3;
System.out.println("result = " + result);
result /= 5;
System.out.println("result = " + result);
result %= 5.0;
System.out.println("result = " + result);
int score = 85;
char grade = (score > 90)? 'A' : ((score>80)?'B':'C'); // 90이상일땐 A 80 밑으로는 C 'A,B'는 참일때 'C'는 거짓일 때
System.out.println(score + "점은" + grade+"등급입니다.");
System.out.print("정수를 입력하세요");
int time = sc.nextInt();
int second = time % 60;
int minute = (time/60)%60;
int hour = (time/60)/60;
System.out.print(time + "초는");
System.out.print(hour+"시간");
System.out.print(minute+"분");
System.out.print(second+"초 입니다.");
int a = 3, b = 3, c = 3;
a += 3;
b *= 3;
c %= 2;
int d = 3;
a = d++; // a = 3, d = 4
a = ++d; // a = 4, d = 4
++d;
a = d;
System.out.println("a : "+a+", d :"+d);
a = ++d;
if((a >10) && (d ==4)) {
Scanner sc = new Scanner(System.in);
System.out.print("점수를 입력하시오: ");
int score = sc.nextInt();
if(score >= 80) {
System.out.println("축하합니다! 합격입니다.");
System.out.println("점수는 :"+score + "점");
}
else {
System.out.println("불합격입니다.");
}
sc.close();
}
Scanner sc = new Scanner(System.in);
System.out.print("점수를 입력하시오: ");
int score = sc.nextInt();
if(score >= 90) {
System.out.println("등급은 A");
}
else if(score >80) {
System.out.println("등급은 B");
}
else if(score >=70) {
System.out.println("등급은 C");
}
else {
System.out.println("등급 외.");
Scanner sc = new Scanner(System.in);
System.out.println("점수를 입력하시오: ");
int score = sc.nextInt();
char grade;
switch(score/10) {
case 10:
grade = 'A';
break;
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
default :
grade = 'F';
System.out.println("swtich");
Scanner sc = new Scanner(System.in);
System.out.println("점수를 입력하시오(0~100): ");
int score = sc.nextInt();
System.out.println("학년을 입력하시오(1~4): ");
int year = sc.nextInt();
if(score >= 60) {
if(year != 4) {
System.out.println(year+"학년. 합격입니다.");
}else if(score >=70) {
System.out.println(year+"학년" + score +"점. 합격입니다.");
}else {
System.out.println(year+"학년" + score +"점. 불합격입니다.");
}
}else {
System.out.println(score +"점. 60점 미만 불합격입니다.");
import java.util.Scanner;
public class d1128 {
public static void main(String[] args) {
int score;
Scanner sc = new Scanner(System.in);
score = sc.nextInt();
if(score >= 90) {
System.out.println("점수가 90보다 큽니다");
System.out.println("A등급입니다.");
} else if(score>=80){
System.out.println("점수가 80보다 큽니다");
System.out.println("B등급입니다.");
} else if(score>=70) {
System.out.println("점수가 70보다 큽니다");
System.out.println("C등급입니다.");
} else {
System.out.println("점수가 70미만입니다");
System.out.println("D등급입니다.");
import java.util.Scanner; (지정된 숫자들 사이에 랜덤으로 숫자가 나오게 하는 방법)
public class d11281 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = (int)(Math.random() * 6) + 1;
if(num==1) {
System.out.println("1번이 나왔습니다.");
}else if(num==2) {
System.out.println("2번이 나왔습니다.");
}else if(num==3) {
System.out.println("3번이 나왔습니다.");
}else if(num==4) {
System.out.println("4번이 나왔습니다.");
}else if(num==5) {
System.out.println("5번이 나왔습니다.");
}else {
System.out.println("6번이 나왔습니다.");
import java.util.Scanner; (위의 랜덤방식을 switch,case를 사용하여 적용한 방법)
public class d11282 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = (int)(Math.random() * 6) + 1;
switch(num) {
case 1 :
System.out.println("1번이 나왔습니다.");
break;
case 2:
System.out.println("2번이 나왔습니다.");
break;
case 3:
System.out.println("3번이 나왔습니다.");
break;
case 4:
System.out.println("4번이 나왔습니다.");
break;
case 5:
System.out.println("5번이 나왔습니다.");
break;
default :
System.out.println("6번이 나왔습니다.");
break;
for(int i = 1 ; i <= 10 ; i++ ) { //( 괄호 안 3가지를 앞에서 부터 설명 하자면 숫자 1부터 10까지 구할 것 이고, i=1 인데 1부터 10까지 1씩 더할 거라는 뜻)
System.out.println(i);
}
int sum = 0;
for( int i=1 ; i <= 100; i++) { //(초기문(int i=1);조건식;i <= 100;증강식 (i++) 반복 후 작업(System.out.println(i);)
//System.out.println(i);
sum = sum + i; //sum += 1; (둘다 똑같은 결과이지만, 2가지 방법이 있다.)
//System.out.println(sum);
}
System.out.println(sum); //(위에 출력 값을 이곳에 적으면 결과 값이 여러줄이 나오는게 아닌 마지막 줄 한줄만 출력된다.)
float sum = 0; //(위에 식에서 int를 float으로 바꿔서 해보는 츌력값)
for( float i= 0.1f ; i <= 1.0f ; i+=0.1f) {
System.out.println(i);
sum += i;
}
System.out.println(sum);
float sum = 0; //(단계 별로 더 하는게 아닌 반대로 점점 빼는 출력값)
for( float i= 1.0f ; i >= 0.1f ; i-=0.1f) {
System.out.println(i);
sum += i;
}
System.out.println(sum);
int i = 1; //(초기문)
while (i<=10) { //(조건식)
System.out.println(i); //(작업문)
i++; //(반복 후 작업)
}
int i = 11; //(do-while 문은 참 거짓을 따지지 않고 무조건 실행 한다.)
do {
System.out.println(i);
i++;
}while (i<=10);
while(true) {
int num = (int)(Math.random() *6)+1;
System.out.println(num);
if(num==6) {
break; //(첫번쨰 반복문을 끝낸다 그 반복문은 while문)
}
}
System.out.println("프로그램종료");
for(int m=2; m<=9 ; m++) {
System.out.println(m+ "단");
for(int i=1; i<=9 ; i++) {
System.out.println(m +" x "+ i + "= " +(m*i) );
int a = 98, b = 105, c = 3;
int max = 0, mid = 0, min =0, temp;
max = a;
mid = c;
min = b;
if(max < mid) {
temp = mid;
mid = max;
max = temp;
}
if(mid < min) {
temp = min;
min = mid;
mid = min;
}
if(mid < min) {
temp = min;
min = max;
max = temp;
}
if(mid < min) {
temp = mid;
mid = min;
min = temp;
}
}
}
import java.util.Scanner;
Scanner sc= new Scanner(System.in);
int intArray[] = new int[5];
double x;
char v1 = 'A';
if(v1=='A') {
int v2 = 100;
double v3 = 3.14;
int arr[] = new int[3];
}
boolean v4 = true;
String str1 = "빅데이터";
String str2 = "빅데이터";
if(str1 == str2) {
System.out.println("str1과 str2 참조가 같음");
}else {
System.out.println("str1과 str2 참조가 다름");
}
if(str1.contentEquals(str2)) {
System.out.println("str1과 str2 문자열이 같음");
}
String str3 = new String("UI개발");
String str4 = new String("UI개발");
str3 = str4; //str4 =str3;
if(str3 == str4) {
System.out.println("str3과 str4 참조가 같음");
}else {
System.out.println("str3과 str4 참조가 다름");
}
if(str1.contentEquals(str2)) {
System.out.println("str3과 str4 문자열이 같음");
}
}
}
import java.util.Scanner;
enum Week { 월, 화, 수, 목, 금, 토, 일 }
Scanner sc = new Scanner(System.in);
int intArray[] = new int[5];
int max=0;
System.out.println("양수 5개를 입력하세요.");
for(int i=0;i<intArray.length;i++) { // i<5 대신 intArray.length를 사용하므로써 intArray가 가지고 있는 length의 숫자를 가져온다.
intArray[i] = sc.nextInt();
if(intArray[i] > max) {
max = intArray[i];
}
}
System.out.print("가장 큰 수는 "+max+"입니다.");
sc.close();
int intArray[] = new int[5];
int [] n = {1, 2, 3, 4, 5};
n[5]=10;
String names[] = {"사과", "배", "바나나", "체리", "딸기", "포도"}; // 배열은 6개 타입은 String 배열의 이름은 names
int sum = 0;
for(int k : n) {
System.out.print(k + " ");
sum += k;
}
System.out.println();
for(String s : names) {
System.out.print(s + " ");
System.out.println();
}
for(Week day : Week.values() )
System.out.print(day + "요일 ");
System.out.println();
}
}
int[] arr = {10, 20, 30, 50, 3, 60, -3};
int sum = 0;
double avg = 0.0;
for (int i= 0; i<arr.length; i++) {
sum += arr[i];
}
avg = sum / arr.length;
System.out.println("총합:" + sum + "평균:" + avg);
}
}
int[] score = {13, 55, 99};
System.out.println("score[0] :" + score[0]);
System.out.println("score[1] :" + score[1]);
System.out.println("score[2] :" + score[2]);
// System.out.println("score[3] :" + score[3]);
int sum=0;
for(int i=0; i<score.length;) {
sum += score[i];
}
System.out.println("sum : "+ sum);
}
}
int[] a = new int[5];
a[0] = 10;
a[1] = 22;
a[2] = 39;
a[3] = 99;
a[4] = 88;
int[] b = {22, 33, 44, 55, 66, 77}; //new int[6]
int[] c ;
c = new int[11];
int[] d = {1, 2, 3, 4, 100};
//d = {1, 2, 3, 4, 100};
int[] e;
e = new int[] {5, 6, 7, 2, 4, 11};
}
}
int a = 30;
int b = 88;
int sum = add(a, b);
System.out.println("add함수 sum : " + sum);
int[] score ;
score = new int[] {33, 55, 77};
int hap = addArr(score);
System.out.println("배열 hap : " + hap);
}
public static int addArr(int[] s) {
int sum = 0;
for(int i=0; i<s.length ; i++) {
sum += s[i];
}
return sum;
}
public static int add(int x, int y) {
int hap = x + y ;
return hap;
}
}
if(args.length !=2) {
System.out.println("매개변수 수가 부족합니다.");
}
int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[1]);
System.out.println(num1 + num2);
int [] arr = new int[4];
arr [0] = 7; arr [1] = 8; arr [2] = 11; arr[3] = 20;
int sum = f(arr);
}
public static int f(int[] frr) {
int sum=0;
for(int i=0; i<frr.length ; i++) {
sum += frr[i];
}
return sum;
}
}
int[][] grade = new int[3][4];
int[][] score = new int[3][];
score[0] = new int[4];
score[1] = new int[2];
score[2] = new int[3];
for(int i=0; i<grade.length; i++) {
for(int j=0; j<grade[0].length ; j++) {
grade[i][j] = i+j;
System.out.print(grade[i][j] + " ");
}
}
System.out.println();
for(int i=0; i<score.length; i++) {
for(int j=0; j<score[i].length ; j++) {
score[i][j] = i+j;
System.out.print(score[i][j] + " ");
}
}
// int[] a = {1, 3, 5, 7};
// int[][] b = {{1,4,8}, {2,3}, {2,6,7,9} };
}
}
int [] age;
String names[];
age = new int[3];
names = new String[3];
age[0] = 1; age[1] = 2; age[2] = 3;
names[0] = "홍길동"; names[1] = "전우치"; names[2] = "이도";
String names1[] = {"홍길동", "전우치", "이도"};
String names2[] = new String[] {"홍길동", "전우치", "이도"};
for(int i=0; i<3; i++) {
System.out.println("age["+i+"]="+age[i]);
System.out.println("names["+i+"]="+names[i]);
}
for(String name : names2) {
System.out.println(name);
}
String cities[] = {"서울", "대구", "대전", "부산"};
String nation[] = {"대한민국", "크로아티아", "일본", "브라질", "가나"};
String newArr[] = new String[cities.length + nation.length];
System.arraycopy(cities, 0, newArr, 0, cities.length);
System.arraycopy(nation, 0, newArr, cities.length, nation.length);
for(String str : newArr) {
System.out.println(str);
}
int[][] multiArr1 = new int[2][2];
int multiArr2 [][] = new int[3][3];
int[][] multiArr3 = new int[4][];
int[] multiArr4[] = new int[5][5];
String[] strArr = new String[3];
strArr[0] = "java";
strArr[1] = "java";
strArr[2] = new String("java");
if(strArr[0]==strArr[1]) {
System.out.println("[0,1]같은 객체입니다.");
}
if(strArr[0] .equals(strArr[2])) { //문자열의 비교를 할땐 equals를 사용
System.out.println("[0,2]같은 객체입니다.");
}
String[] oldStr = {"java", "array", "copy", "string", "object"};
String[] newStr = new String[oldStr.length];
newStr[0] = oldStr[0];
for(int i=0; i<oldStr.length ; i++) {
newStr[i] = oldStr[i];
}
}
}
import java.util.Scanner;
// int max = 0;
// int[] array = {1, 5, 3, 8, 2 };
// for(int i = 1; i<array.length; i++) {
// if(array[i] > max) {
// max = array[i];
// }
// }
// System.out.println("최대값:" + max);
// System.out.println("max: "+ max);
// int[][] array = {
// {95, 86},
// {83, 92, 96},
// {78, 83, 93, 87, 88}
// };
// int sum = 0;
// double avg = 0.0;
// double number = 0;
// for(int i=0; i<array.length; i++) {
// for(int j=0; j<array[i].length; j++) {
// sum += array[i][j];
// number++;
// }
// }
// System.out.println("sum: "+ sum);
// System.out.printf("avg : %f",sum/number);
boolean run = true;
int studentNum = 0;
int scores[] = null;
int sum = 0;
int max = 0;
Scanner scanner = new Scanner(System.in);
while(run) {
System.out.println("------------------");
System.out.print(" 1.학생수");
System.out.print(" 2.점수입력");
System.out.print(" 3.점수리스트");
System.out.print(" 4.분석");
System.out.println(" 5.종료");
System.out.print("선택 >>");
int selectNo = Integer.parseInt(scanner.next());
if(selectNo == 1) {
studentNum = scanner.nextInt();
scores = new int[studentNum];
}else if(selectNo == 2) {
for(int i=0; i < studentNum; i++) {
scores[i] = scanner.nextInt();
sum += scores[i];
if(scores[i] > max) {
max = scores[i];
}
}
}else if(selectNo == 3) {
for(int i=0; i < scores.length; i++) {
System.out.printf("점수 : %d \n",scores[i]);
}
}else if(selectNo == 4) {
System.out.printf("max : %d\t", max);
System.out.printf("avg : %f", (double)sum/studentNum);
}else if(selectNo == 5) {
run = false;
}
}
}
}
package std; //src 파일을 우클릭후 new > enum을 클릭후 파일을 만든다
public enum Week {
MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
import java.util.Calendar;
import std.Week;
Week today = null;
Calendar cal = Calendar.getInstance();
int w = cal.get(Calendar.DAY_OF_WEEK);
switch(w) {
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:
Week.SUNDAY = 5;
today = Week.FRIDAY; break;
case 7:
today = Week.SATURDAY; break;
}
System.out.println("오늘 요일은 : "+today);
if(today == Week.SUNDAY) {
System.out.println("일요일엔 쉽니다.");
}else {
System.out.println("열심히 공부합니다.");
}
}
}
int[][] numArr = new int[5][5];
for(int i=0; i<numArr.length; i++) {
for(int j=0; j<numArr[i].length ; j++) {
if(i==0 || i==numArr.length-1 || j==0 || j==numArr[i].length-1) {
numArr[i][j] = 1;
}
}
}
for(int i=0; i<numArr.length; i++) {
for(int j=0; j<numArr[i].length ; j++) {
System.out.print(numArr[i][j]+" ");
}
System.out.println();
}
}
}

String name;
int age;
void eat() {}
void sleep() {
}
void love() {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int radius; // 원의 반지름 필드
String name; // 원의 이름 필드
public Circle() {} // 생성자
public double getArea() { // 원의 면적 계산 메소드
return radius * radius * 3.14;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Circle pizza; // 래퍼런스 변수 pizza 선언
pizza = new Circle(); // Circle 객체 생성
pizza.radius = 24; // 피자의 반지름을 10으로 설정
pizza.name = "자바피자"; // 피자의 이름 설정
double area = pizza.getArea(); // 피자의 면적 알아내기
System.out.println(area);
int radius;
String name;
public Circle1() { }
public double getArea() {
return radius * radius * 3.14;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Circle donut = new Circle();
donut.radius = 2;
donut.name = "자바도넛";
double area = donut.getArea();
System.out.println(donut.name + "의 면적은" + area);
int radius;
String name;
public Circle2() {
}
public Circle2(int a, String s) {
}
public Circle2(String s) {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Circle c = new Circle();
Circle2 pizza = new Circle2(10, "자바피자");
Circle2 donut = new Circle2("크리스피");
pizza.radius = 50;
import java.util.Scanner;
class Rectangle{
int width;
int height;
public int getArea() {
return width * height;
}
}
public class RectApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle rect = new Rectangle();
Scanner sc = new Scanner(System.in);
System.out.println(">> ");
rect.width = sc.nextInt();
rect.height = sc.nextInt();
System.out.println("사각형의 면적은" + rect.getArea());
sc.close();
추상 메소드(abstract method)
선언되어 있으나 구현되어 있지 않은 메소드, abstract로 선언
public abstract String getName();
public abstract void setName(String s);
추상 메소드는 서브 클래스에서 오버라이딩하여 구현해야 함
추상 클래스(abstract class)의 2종류
1.추상 메소드를 하나라도 가진 클래스
(클래스 앞에 반드시 abstract라고 선언해야 함)
2.추상 메소드가 하나도 없지만 abstract로 선언된 클래스
abstract class Shape { //추상 클래스 선언
public Shape(){}
public void paint() {}
추상 클래스는 객체를 생성할 수 없다.
추상 클래스의 단순 상속
추상 클래스를 상속받아, 추상 메소드를 구현하지 않으면 추상 클래스 됨
서브 클래스도 abstract로 선언해야 함
추상 클래스 구현 상속
서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
서브 클래스는 추상 클래스 아님
클래스 내부에 선언한 클래스
두 클래스의 멤버들을 서로 쉽게 접근
코드 복잡성 줄임

인터페이스 역시 클래스 내부에 선언 가능
해당 클래스와 연관 있는 구현 클래스 만들기 위함

클래스의 멤버로서 선언되는 중첩 클래스
메소드 내부에서 선언되는 중첩 클래스
메소드 실행할 때만 사용되고 메소드 종료되면 사라짐


static 키워드 없이 중첩 선언된 크랠스
인스턴스 필드와 메소드만 선언 가능하고 정적 필드와 메소드는 선언할 수 없음

A 클래스 외부에서 B 객체 생성하려면 먼저 A객체 생성 후 B객체 생성 필요

static 키워드로 선언된 클래스
모든 종류의 필드와 메소드 선언 가능

A 클래스 외부에서 정적 멤버 클래스 C 객체 생성할 경우 A 객체 생성 필요하지 않음

중첩 클래스를 메소드 내에서 선언할 수 있음
접근 제한자 및 static 붙일 수 없음
인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언 불가

바깥 클래스에서 인스턴스 멤버 클래스 사용 시

멤버 클래스 내부에서 바깥 클래스의 필드와 메소드에 접근하는 경우

이름이 없는 객체
어떤 클래스를 상속하거나 인터페이스를 구현하여야 함

부모 클래스 상속하여 자식 클래스 선언
new 연산자 이용하여 자식 객체 생성 후 부모 타입의 필드나 변수에 대입

익명 자식 객체 생성하여 사용

필드 선언할 때 초기값으로 익명 자식 객체 생성하여 대입

메소드 내에서 로컬 변수 선언 시 초기값으로 익명 자식 객체 생성하여 대입

메소드 매개 변수가 부모 타입일 경우 메소드 호출하는 코드에서 익명 자식 객체 생성하여 매개값으로 대입

익명 자식 객체에 새롭게 정의된 필드 및 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근할 수 없음


구현 클래스가 재사용되지 않고 특정 위치에서만 사용되는 경우 - 익명 구현 객체 생성

필드 선언 시 추기값으로 익명 구현 객체 생성하여 대입하는 경우

메소드 내에서 로컬 변수 선언 시 초기값으로 익명 구현 객체 생성하여 대입

메소드의 매개 변수가 인터페이스 타입일 때 메소드 호출하는 코드에서 익명 구현 객체 생성하여 매개값으로 대입하는 경우

윈도우 및 안드로이드 등의 UI 프로그램에서 버튼의 클릭 이벤트 처리
Window 클래스를 2개의 Button 객체 가진 창이라 가정
첫 번째 button1 클릭 이벤트 처리는 필드로 선언한 익명 구현 객체가 담당
두 번째 button2 클릭 이벤트 처리는 setOnClickListener() 호출할 때 매개값으로 준 익명 구현 객체가 담당
매개 및 로컬 변수가 수정되어 값 변경되면 매개 및 로컬 변수를 final로 선언할 것을 요구




컬렉션은 제네릭(generics) 기법으로 구현됨
컬렉션의 요소는 객체만 가능
기본적으로 int, char, double 등의 기본 타입 사용 불가
JDK 1.5부터 자동 박싱/언박싱으로 기본 타입 값을 객체로 자동 변환
재네릭
특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법
, , : 타입 매개 변수
요소 타입을 일반화한 타입
제네릭 클래스 사례
제네릭 스택 : Stack
E에 특정 타입으로 구체화
정수만 다루는 스택 Stack
문자열만 다루는 스택 Stack











java.util.ArrayList, 가변 크기 배열을 구현한 클래스
에서 E대신 요소로 사용할 특정 타입으로 구체화
ArrayList에 삽입 가능한 것
객체,null
기본 타입은 박싱/언방식으로 Wrapper 객체로 만들어 저장
ArrayList에 객체 삽입/삭제
리스트의 맨 뒤에 객체 추가
리스트의 중간에 객체 삽입
임의의 위치에 있는 객체 삭제 가능
벡터와 달리 스레드 동기화 기능 없음
다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음
개발자가 스레드 동기화 코드 작성







키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
java.util.HashMap
K는 키로 사용할 요소의 타입,V는 값으로 사용할 요소의 타입 지정
키와 값이 한 쌍으로 삽입
키는 해시맵에 삽입되는 위치 결정에 사용
값을검색하기 위해서는 반드시 키 이용
삽입, 삭제, 검색이 빠른 특징
요소 삽입 : put() 메소드
요소 검색 : get() 메소드
*예) HashMap<String, String> 생성, 요소 삽입, 요소 검색







java.util.LinkedList
E에 요소로 사용할 타입 지정하여 구체화
List 인터페이스를 구현한 컬렉션 클래스
Vector,ArrayList 클래스와 매우 유사하게 작동
요소 객체들은 양방향으로 연결되어 관리됨
요소 객체는 맨 앞, 맨 뒤에 추가 가능
요소 객체는 인덱스를 이용하여 중간에 삽입 가능
맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용 가능

java.util 패키지에 포함
컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴
모든 메소드는 static 타입
주요 메소드
컬렉션에 포함된 요소들을 소탕하는 sort()메소드
요소의 순서를 반대로 하는 reverse()메소드
요소들의 최대, 최솟값을 찾아내는 max(), min() 메소드
특정 값을 검색하는 binarySearch() 메소드




'<'과'>'사이에 하나의 대문자를 타입 매개변수로 사용
많이 사용하는 타입 매개 변수 문자
E : Element를 의미하며 컬렉션에서 요소를 표시할 때 많이 사용한다.
T : Type을 의미한다.
K : Key를 의미
타입 매개변수가 나타내는 타입의 객체 생성 불가
타입 매개변수는 나중에 실제 타입으로 구체화
어떤 문자도 매개 변수로 사용 가능



