반응형
상속
- 서로 관련있는 여러 클래스에 공통으로 등장하는 속성과 기능을 별도의 클래스(부모클래스)에 정의하고, 여러클래스(자식클래스들이 물려받는것.
- 코드의 중복을 제거할 수 있다.
- 부모클래스타입의 변수에 자식 클래스타입의 객체를 담을 수 있다.
메소드 재정의(Method override)
- 부모클래스로부터 물려받은 기능이 자신에게 적합하지 않을 때, 똑같은 이름으로 다시 정의하는 것
- 메소드 재정의를 할 때는 반드시 리턴타입, 메소드이름, 매개변수의 갯수와 타입을 부모에서 물려받은 것과 완벽하게 똑같이 해야한다.
(단, 내부구현 내용만 다르게 구현)
추상화
- 구체적인 기능의 정의를 각각의 개별클래스(자식클래스)로 위임시키는 것
package oop10;
public abstract class Printer { //추상클래스
//추상클래스는 메소드가 반드시 있지 않아도 클래스만 있어도 추상클래스를 선언할수 있다.
//추상메소드 - 구현이 없는 메소드
//공동작업시 용이 하다. 메소드 이름을 반드시 지정된 메소드 이름으로 사용되도록 하기위해
//추상메소드 및 클래스는 객체 생성을 할수 없다.
//추상메소드를 사용하려면 클래스에도 abstract를 선언해야한다.
//추상클래스를 사용하는 용도는 자식클래스에서 기능을 재정의 할 가능성이 있다면 추상화 시켜서 사용한다.
public abstract void print();
public void powerOn(){
System. out.println( "전원켜기" );
}
public void powerOff(){
System. out.println( "전원끄기" );
}
}
package oop10;
public class LaserPrinter extends Printer {
@Override
public void print() {
// TODO Auto-generated method stub
//추상클래스 및 추상 메소드로 정의된것을 다른클래스에 사용하려면 메소드를 재정의 한후 기능을 추가해주면 상속 받고 출력이 가능하다.
rager();
System. out.println( "레이져를 출력 합니다." );
}
private void rager(){
System. out.println( "레이저로 쏘자 빔~~~" );
}
}
package oop10;
public class ColorPrinter extends Printer {
@Override //Annotation 부모에있는 메소드를 재정의 하는구나 meta데이타 변수의 이름을 meta data라 부른다.
public void print() {
// TODO Auto-generated method stub
changeColor();
System. out.println( "컬러로 출력합니다." );
}
private void changeColor(){
System. out.println( "적절한 잉크카트리지를 사용" );
}
}
package oop10;
public class PrinterApp {
public static void main(String[] args){
LaserPrinter p1 = new LaserPrinter();
ColorPrinter c1 = new ColorPrinter();
p1.print(); //레이저프린터에서 출력하기 기능 print()
c1.print(); //컬러프린터에서 출력하기 기능은 print()
//결과____________
//레이저로 쏘자 빔~~~
//레이져를 출력 합니다.
//적절한 잉크카트리지를 사용
//컬러로 출력합니다.
}
}
package oop10;
public abstract class DBAccess {
private void connect(){
System. out.println( "DB 연결" );
}
private void disconnect(){
System. out.println( "DB 연결 해제" );
}
//public void final process(){ // final 키워드를 사용하면 메소드 변경을 절대 할수 없다.
//final을 붙일수 있는것 class = 상속 받지마, method = 재정의 하지마, 변수 = 변경하지마
//자식클래스에서 절대 사용할수 없게
public void process(){
connect(); //DB연결
work(); //작업
disconnect(); //DB연결 끊기
}
public abstract void work(); //작업메소드는 재정의되서 무조건 사용되기 때문에 추상화시킨다.
}
package oop10;
public class AddWork extends DBAccess {
public void work(){
System. out.println( "db 저장 쿼리문 줄줄줄~~" );
}
}
package oop10;
public class DBAccessApp {
public static void main(String[] args){
//이와같이 자주 사용되는것을 추상화 및 상속을 받아서 실제 작업인 work 메소드만 구현하여 하는것을 템플릿 패턴이라고 한다.
AddWork a = new AddWork();
a.process();
//결과_______________
//DB 연결
//db 저장 쿼리문 줄줄줄~~
//DB 연결 해제
//추상화
//구체적인 기능의 정의를 각각의 개별 클래스(자식클래스)로 위임시키는
//구체적인 기능의 구현책임을 자식클래스한테 위임시킨다.
//해당 기능을 사용하는 방법이 동일한 자식 클래스가 만들어진다.
}
}
Object 최상위 부모
object to string = 클래스별명 해쉬코드
object equals = 주소값을 비교
object hashcode = 해쉬코드값을 읽어올수 있음 객체가 생성될때 생성되는 의미없는 일련번호
object getclass = 설계도를 뽑아낸다 해당객체에 메소드가 무엇인지 메소드의 매개변수가 무엇인지 , 변수의 타입이 무엇인지 알아낼수 있음 실제 쓰지 않음
object clone() = 복제본을 만들때 사용
object finalize = 객체가 아무도 참조 안할때 가비지 컬렉터가 청소를 하는데 그객체에 finalize를 한번 호출하고 청소한다. 객체가 청소 되기전에 실행되는 메소드
package oop10;
public class Sample {
int no;
String name;
public void exe(){
System. out.println( "번호:" + no );
System. out.println( "이름:" + name );
}
//alt + shift + s 누른뒤 generate to string을 누르면 자동생성됨
@Override
public String toString() {
return "Sample [no=" + no + ", name=" + name + "]";
}
//alt + shift + s 누른뒤 generate to hash code 누르면 equals를 재정의 할수 있다.
//원래는 주소값 비교인데 해쉬값과 이퀄스만 재정의 하면 사용할수 있다.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + no;
return result;
}
@Override
public boolean equals(java.lang.Object obj) {
if ( this == obj)
return true;
if ( obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Sample other = (Sample) obj;
if ( no != other. no)
return false;
return true;
}
}
package oop10;
public class Object {
public static void main(String[] args){
Sample s1 = new Sample();
s1. no = 23;
s1. name = "홍길동" ;
Sample s2 = new Sample();
s2. no = 23;
s2. name = "홍길동" ;
String desc1 = s1.toString();
String desc2 = s2.toString();
System. out.println( desc1);
System. out.println( desc2);
System. out.println( s1);
System. out.println( s2);
System. out.println( s1.toString());
System. out.println( s2.toString());
//결과_______________
// oop10.Sample@19e0bfd
// oop10.Sample@139a55
// oop10.Sample@19e0bfd
// oop10.Sample@139a55
// oop10.Sample@19e0bfd
// oop10.Sample@139a55
//oop10 설명 Sample 클래스이름 @19e0bfd 해쉬코드 객체 생성시 의미없이 생성되는 코드
//결과_______________
System. out.println( s1.equals( s2));
// Sample [no=23, name=홍길동]
// Sample [no=26, name=홍길동]
// Sample [no=23, name=홍길동]
// Sample [no=26, name=홍길동]
// Sample [no=23, name=홍길동]
// Sample [no=26, name=홍길동]
// true
}
}
+ - * , ; = 원래 연산잔데 파이썬같은 언어의 경우는 연산자도 객체가 될수 있고 재정의 할수 있다.
byte, short, int, long, float, double, boolean, char -> 기본자료형
위 자료형도 클래스로 만들어났다.
Byte, Short, Integer, Long, Float, Double, Boolean, Character -> Wrapper Class(비닐 감싸다)
int a = 3; 숫자 3표현
Integer a = new Integer(3); 숫자3 표현 인티져라는 객체안에 3이 저장된다.(객체기 때문에 유용한 기능이 많이 있다.)
오토박싱
Integer a = 객체;
Integer a = 4;//(Integer a = new Integer(4);) -> 내부적으로 이렇게 됨
오토언박싱
int a = new Integer(12);//객체를 빼고 정수 12만 a변수에 들어가도록 처리되는것
상호변환이 자동적으로 일어난다.
package lang;
public class WrapperDemo {
public static void main(String[] args){
//wrapper 클래스 - 기본 자료형과 대응되는 클래스들
//오토 박싱
Integer i1 = new Integer(23);
Integer i2 = new Integer( "23");
Integer i3 = 34; //오토박싱 : 23을 가지는 Integer 객체가 만들어진다.
Double d1 = new Double(3.14);
Double d2 = new Double( "3.14");
Double d3 = 3.14;
int i4 = i1; //언박싱:Integer 객체에서 23만 꺼낸다.
System. out.println( i1);
System. out.println( i2);
System. out.println( i3);
System. out.println( d1);
System. out.println( d2);
System. out.println( d3);
/* 결과_
23
23
34
3.14
3.14
3.14
*/
}
}
package lang;
public class WrapperDemo2 {
public static void main(String[] args){
//메소드가 static으로 정의 되어 있기 때문에 new생성자로 생성하지 않고 작업해도 됨
System. out.println(Integer. MAX_VALUE);
System. out.println(Integer. MIN_VALUE);
System. out.println(Long. MAX_VALUE);
System. out.println(Long. MIN_VALUE);
System. out.println(Double. MAX_VALUE);
System. out.println(Double. MIN_VALUE);
String str1 = "123";
int number1 = Integer. parseInt( str1);
String str2 = "3.141592";
double number2 = Double. parseDouble( str2);
System. out.println( number1 * number2);
String str3 = Integer. toOctalString(56);
String str4 = Integer. toHexString(56);
String str5 = Integer. toBinaryString(56);
System. out.println( "56의 8진수 : " + str3 );
System. out.println( "56의 16진수 : " + str4 );
System. out.println( "56의 2진수 : " + str5 );
//결과화면_______________
// 2147483647
// -2147483648
// 9223372036854775807
// -9223372036854775808
// 1.7976931348623157E308
// 4.9E-324
// 386.415816
// 56의 8진수 : 70
// 56의 16진수 : 38
// 56의 2진수 : 111000
}
}
//kim ,4 ====
//kang , 10 =========
//결과 화면
package lang;
import java.io.File;
import java.util.Scanner;
public class WrapperDemo3 {
public static void main(String[] args) throws Exception {
//파일 읽기
Scanner sc = new Scanner( new File("src/lang/score2.txt" ));
//정수 데이타 읽어오기
String[] list = new String[4];
for( int i=0; i< list. length; i++){
int count = 0;
list[ i] = sc.nextLine();
String[] arr = list[ i].split( ",");
for( int j=0; j< arr. length; j++){
System. out.print( arr[ j] + " ");
count = Integer. parseInt( arr[1]);
}
System. out.println( "\t");
for( int k=0; k< count; k++){
System. out.print( "=");
}
System. out.println();
}
}
}
score2.txt
kim ,4
kang ,10
hong ,20
park,15
package lang;
import java.io.File;
import java.util.Scanner;
public class WrapperDemo4 {
public static void main(String[] args) throws Exception{
Scanner s = new Scanner( new File("src/lang/score3.txt" ));
String[] list = new String[4];
System. out.println( "===== 성적결과 =====" );
for( int i=0; i< list. length; i++){
int max = 0;
list[ i] = s.nextLine();
String[] arr = list[ i].split( ",");
for( int j=0; j< arr. length; j++){
System. out.print( arr[ j] + " ");
}
max = Integer. parseInt( arr[1]) + Integer.parseInt( arr[2]) + Integer. parseInt(arr [3]);
System. out.println( " 합계 : " + max );
}
}
}
score3.txt
kim ,20,30,40
kang ,40,60,30
park,10,40,80
hong ,60,50,10
package lang;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args){
//난수
Random r = new Random();
int j=1;
while( true){
System. out.println( r.nextInt(45)+1);
j++;
if( j>6){
break;
}
}
for( int i=1; i<10; i++){
System. out.println( r.nextInt(10)+1);
}
}
}
package exam2;
import oop7.Phone;
import oop7.Iphone;;
public class CastDemo {
public static void main(String[] args){
Phone p = new Iphone();
//p.facetime(); 접근할 수 없는 기능
//어떤 특정 기능때문에 바로 Iphone객체를 생성을 못했을때 아래처럼 부모 기능을 쓸수 있는 방법이 있다.
Iphone i = (Iphone) p;
((Iphone) p).facetime(); //형변환
String[] names = { "길동이" , "을지문덕이" };
String n = names[0];
Object[] titles = { "어벤져스2" ,"쥬라기공원 4" };
//String t = titles[0];//바라보는방향이 잘못돼서 에러
String t = (String) titles[0]; //바라보는방향이 잘못돼서 에러
}
}
반응형