어제거 복습

#추상 클래스 abstract class : 무조건 상속

#추상 메소드 abstract meghod : 무조건 오버라이딩 (상속을 받아야한다는 말)


class 내에 한 개이상의 추상메소드가 존재한다면 그 클래스는 abstract class로 만들어줘야 한다.


다형성


부모의 참조변수로 자식들의 class를 참조하는 것.


예시


(조상클래스)

class Soldier 


String name;

String level;

method 인사();


(자손클래스)

병장 - method 짱박();

상병 - method 갈굼();

일병 - method 일하기();

이병 - method 어리버리();



이전에는

병장 b = new 병장();


다형성 사용하면

(부모의 참조변수로 자식들의 class를 참조, 상속관계에서만 가능, 자손간에는 불가능)

Soldisr s = new  병장();



s.name;

s.level;

s.인사();

>접근가능


s.짱박();

>접근불가능


짱박을 쓰려면 (s를 형변환!)


병장 b = (병장)s


b는 s와 같은 주소값을 참조하지만 (b와s는 주소값이 같음!)

b.name

b.level

b.인사();

b.짱박();

짱박();메소드도 불러올 수 있다.




병장 [] ar = new 병장[3];




##################################################


public abstract class Weapon {

String name;

public abstract void prn();

}




public class Sword extends Weapon{

String name="검";

//검을 나타내는 메소드랑 변수 선언;


@Override

public void prn() {

System.out.println(name);

}

}




public class Axe extends Weapon {

String name = "도끼";

int thunder=2;

//변수랑 메소드;

@Override

public void prn() {

System.out.println(name);

System.out.println(thunder);

}

}




public class Knight {

String name;

Weapon s = new Sword();

public void prn(){

s.prn();

}

}



###############################################


인터페이스란 ? : 클래스라고 생각하면 된다.


인터페이스 : 추상클래스의 일종이라고 생각하자.


일반적으로 인터페이스, 구현이 더 많이 쓰인다.


-일종의 추상클래스. 추상클래스(미완성 설계도)보다 추상화 정도가 높다.

-실제 구현된 것이 전혀 없는 기본 설계도.(알맹이 없는 껍데기)

-추상메서드와 상수만을 멤버로 가질 수 있다.

-인스턴스를 생성할 수 없고, ...........

-이하 10장 교본 참고할 것





#

src 소스 우클릭 > new > Interface > 이름



public interface Test {

//상수

//추상메서드

}


//추상클래스

//멤버변수

//생성자

//멤버메서드

//추상메서드




public class Test2 implements Test {

}



>implements  (구현,  상속과 유사하다)



구현, 상속 동시에 가능함, 그리고 두개이상 구현 가능

다중구현 : 상속의 단점을 보완


public class Sword extends Weapon implements Test, Test3 

> 두개이상 구현가능, 상속과 동시사용가능


####################################






oracle > download > Java for Developers > Download 옆에 Documentation

>가운데 네모 누르고

Reference


클릭


>> 패키지 설명을 읽어볼 수 있다.??


http://docs.oracle.com/javase/8/docs/api/index.html



###########################################


자주사용하는 클래스


1.Object 클래스

(Object클래스는 모든 클래스의 조상클래스이다.)

(최고 조상이라는 것에 의의를 둔다.)

-오직 11개의 메서드만을 가지고 있다.



java.lang에서 Object, String 찾아보기


######################################

package Test;


public class Test1 {

int a;

int b;

}



package Test;

public class TMain {

public static void main(String[] args) {
Test1 t1 = new Test1();
t1.a=10;
t1.b=20;
Test1 t2 = new Test1();
t2.a=10;
t2.b=20;
System.out.println(t1==t2);
}

}



결과
>false

왜? 주소값이 다르다. t1의 주소값과 t2의 주소값이 다르다. new로 주소값을 할당. 


#################################

package Test;


public class TMain {


public static void main(String[] args) {

Test1 t1 = new Test1();

t1.a=10;

t1.b=20;

Test1 t2 = new Test1();

t2.a=10;

t2.b=20;

System.out.println(t1.equals(t2));

}


}


빨간부분을 변경함


equals (  )  괄호안에 object를 넣어야한다 t2 (t2는 Test1 클래스타입)

(Test1 클래스는 Object클래스의 자손.  Test1 t1 = new Test1();  일종의 다형성)




결과

>false




#################################################


package Test;


public class TMain {


public static void main(String[] args) {

Test1 t1 = new Test1();

t1.a=10;

t1.b=20;

Test1 t2 = new Test1();

t2.a=10;

t2.b=20;

System.out.println(t1.equals(t2)); // t1 == t2 비교

System.out.println(t1.toString());

System.out.println(t1);

}


}




결과

false

Test.Test1@659e0bfd

Test.Test1@659e0bfd



주소값이 나옴

###
equals라는 메소드를 오버라이딩하라



####################################################

소스 > 오버라이딩 


package Test;


public class Test1 {

int a;

int b;

@Override

public String toString() {

// TODO Auto-generated method stub

return super.toString();

}

}



###############################################


package Test;


public class Test1 {

int a;

int b;

@Override

public String toString() {

System.out.println("a:"+a);

System.out.println("b:"+b);

return "";

}

}



package Test;

public class TMain {

public static void main(String[] args) {
Test1 t1 = new Test1();
t1.a=10;
t1.b=20;
Test1 t2 = new Test1();
t2.a=10;
t2.b=20;
t1.toString();
}

}

결과
>
a:10
b:20


#############################################

Test의 멤버변수 a, b 

t1과 t2의 a,b가 같으면 트루 다르면 폴스 출력하기


package Test;


public class Test1 {

int a;

int b;


@Override

public String toString() {

System.out.println("a:"+a);

System.out.println("b:"+b);

return "";

}




@Override

public boolean equals(Object obj) {

Test1 t = (Test1)obj;

if(this.a == t.a && this.b==t.b){

return true;

}else{

return false;

}

}

}


package Test;


public class TMain {


public static void main(String[] args) {

Test1 t1 = new Test1();

t1.a=10;

t1.b=20;

Test1 t2 = new Test1();

t2.a=10;

t2.b=20;

//t1.toString();

System.out.println(t1.equals(t2));

}


}



결과

>

true



########################################


package Test;


public class TMain {


public static void main(String[] args) {

Test1 t1 = new Test1();

t1.a=10;

t1.b=20;

Test1 t2 = new Test1();

t2.a=10;

t2.b=20;

//t1.toString();

System.out.println(t1.equals(t2));

System.out.println(t1);

System.out.println(t1.toString());

System.out.println(t1.hashCode());

}


}


결과

>

true

a:10

b:20


a:10

b:20


1704856573    // t1의 주소값 (16진수에서 10진수로)



hashcode란 메모리의 주소값을 10진수로 바꿔준다.




#######################################
toString 오버라이딩 한 것을 지우면
package Test;

public class Test1 {
int a;
int b;




@Override
public boolean equals(Object obj) {
Test1 t = (Test1)obj;
if(this.a == t.a && this.b==t.b){
return true;
}else{
return false;
}
}


}


package Test;

public class TMain {

public static void main(String[] args) {
Test1 t1 = new Test1();
t1.a=10;
t1.b=20;
Test1 t2 = new Test1();
t2.a=10;
t2.b=20;
//t1.toString();
System.out.println(t1.equals(t2));
System.out.println(t1);
System.out.println(t1.toString());
System.out.println(t1.hashCode());
}

}


결과
true
Test.Test1@659e0bfd
Test.Test1@659e0bfd
1704856573



#############################################

모든 클래스는 Object 타입이다.



###
설명서에서 String 찾아보기



###

package Test;

public class TMain {

public static void main(String[] args) {
String name = "suji";
String n = new String("suji");
String n2 = new String("suji");
System.out.println(n2.equals(n));
}

}


############################
charAt 설명 읽어보기
charAt


package Test;

public class TMain {

public static void main(String[] args) {
String name = "choa";
char c = name.charAt(1);
System.out.println(c);
}
}

결과
>
h

0 -> c
1 -> h
2 -> o
3 - >a
4 -> error


> int 번째 글자가 어떤 char 인지 반환해준다.
(인덱스개념)

################################

이번엔 반대로  char 가 몇번째 int 인지 반환해주는 메소드
(인덱스개념)
indexOf


package Test;

public class TMain {

public static void main(String[] args) {
String name = "choa";
int c = name.indexOf('o');
System.out.println(c);
}
}


결과
>
2




# 같은 문자 여러개인 경우 첫번째 인덱스만 알려줌
# 없는 글자를 찾으려하면 결과는 -1 



###############################################
package Test;

public class TMain {

public static void main(String[] args) {
String name = "choa";
for(int i=0 ; i<name.length(); i++){
System.out.println(name.charAt(i));
}
}
}


결과
>
c
h
o
a



########################################
charAt 응용

package Test;

import java.util.Scanner;

public class TMain {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("주민번호 앞 여섯자리 입력");
String num = sc.nextLine();
//출력 => 1994년 12월 24일 형식으로 출력
char a=num.charAt(0);
char b=num.charAt(1);
char c=num.charAt(2);
char d=num.charAt(3);
char e=num.charAt(4);
char f=num.charAt(5);
System.out.println("19"+a+b+"년"+c+d+"월"+e+f+"일");
}
}




결과
>
주민번호 앞 여섯자리 입력
880808
1988년08월08일


############################################
package Test;

import java.util.Scanner;

public class TMain {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("주민번호 앞 여섯자리 입력");
String num = sc.nextLine();
//출력 => 1994년 12월 24일 형식으로 출력
char a=num.charAt(0);
char b=num.charAt(1);
char c=num.charAt(2);
char d=num.charAt(3);
char e=num.charAt(4);
char f=num.charAt(5);
System.out.println("19"+a+b+"년"+String.valueOf(c)+d+"월"+String.valueOf(e)+f+"일");
}
}


##
String.valueOf (  )    >>> 이거 공부하기


String.valueOf()   :  'a' 를 "a" 로 바꿔줌 ( char를 String으로 바꿔줌)



####################################################

앞 두자리 , 뒷 두자리가 맞으면 열리는 문


[내가한거]

package Test;

import java.util.Scanner;

public class TMain {

public static void main(String[] args) {
//앞 두자리 94, 뒷 두자리 26 만 맞으면 열리는 문
String num = "941226";
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("비밀번호를 입력하세요.");
String n = sc.next();
if(n.charAt(0)=='9'&& n.charAt(1)=='4' && n.charAt(n.length()-2)=='2' &&n.charAt(n.length()-1)=='6' ){
System.out.println("열렸습니다.");
break;
}else{
System.out.println("다시입력하세요.");
}
}
}
}


[쌤이한거]
(뒷 4자리 맞추면 열리는문)

package Test;

import java.util.Scanner;

public class TMain {

public static void main(String[] args) {
String number = "941226";
Scanner sc = new Scanner(System.in);
System.out.println("비밀번호를 입력하세요.");
String n = sc.next();
char c1 = n.charAt(0);
char c2 = n.charAt(1);
int num = n.length()-4; // 9 , 5-4
// 11, 7-4
// 13, 9-4
char c3 = n.charAt(num);
char c4 = n.charAt(num+1);
char c5 = n.charAt(num+2);
char c6 = n.charAt(num+3);
}
}



##정리

package Test;

import java.util.Scanner;

public class TMain {

public static void main(String[] args) {
String number = "941226";
Scanner sc = new Scanner(System.in);
System.out.println("비밀번호를 입력하세요.");
String n = sc.next();
char c1 = n.charAt(0);
char c2 = n.charAt(1);
int num = n.length()-4; // 9 , 5-4
// 11, 7-4
// 13, 9-4
char c3 = n.charAt(num);
char c4 = n.charAt(num+1);
char c5 = n.charAt(num+2);
char c6 = n.charAt(num+3);
for(int i=0 ; i<4 ; i++){
if( n.charAt(num+i)==number.charAt(number.length()-4+i)){
System.out.println("열렸씁니다");
}else{
System.out.println("닫혔습니다.");
}
}
}
}


#문제 : 프린트문 4번 반복


############################################################






























블로그 이미지

테시리

,