본문 바로가기

   
Programming/Java

8일차!

반응형
상속
 - 서로 관련있는 여러 클래스에 공통으로 등장하는 속성과 기능을 별도의 클래스(부모클래스)에 정의하고, 여러클래스(자식클래스들이 물려받는것.
 - 코드의 중복을 제거할 수 있다.
 - 부모클래스타입의 변수에 자식 클래스타입의 객체를 담을 수 있다.

메소드 재정의(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]; //바라보는방향이 잘못돼서 에러
     }
     
}


반응형