Java

자바 헷갈리는 내용 정리

최종군 2024. 7. 15. 01:34

메서드 오버로딩 :

 

자바에서 메서드 오버로딩은 동일한 클래스 내에서

동일한 이름의 메서드를 여러 개 정의하되 매개변수 목록(정보)이 다르도록 하는 것을 의미한다 

 

컴파일 오류가 나는 경우는 동일한 시그니처(매개 변수 목록이 동일)로 정의된 메서드들이다 

반환 타입만 다르다소 오버로딩이 되는 것은 아니기 때문에 매개변수 목록이 동일한 메서드가 여러 개 

있으면 컴파일 오류가 발생한다. 

 

컴파일 오류가 발생하는 경우 

메소드 오버로딩 중 매개 변수 정보가 동일한 경우 동일한 메소드에 컴파일 오류가 발생한다 

기준이 되는 메소드도 포함 

 


continue : 특정 조건에서 반복문을 다음 루프로 실행 시키고자 할 때 : continue

 

나는 객체를 생성할 때 new 를 자주 잊는다.

new를 주의하자 

 

다형성 : 부모(상위) 타입으로 파생된 여러가지 타입의 [자식(하위)] 객체들을 

[부모(상위)] 클래스 타입 하나로 다룰 수 있는 기술이다 

 

인터페이스 

- 클래스가 구현해야 할 기능을 [추상] 메소드로 규격 정의한다 

- 인터페이스 구현 시 [implements] 키워드를 사용한다. 

 

인터페이스 구현 표현

 

[접근제한자][예약어]class 클래스명 implements 인터페이스명{}

인터페이스의 모든 필드는 기본적으로 

public static final 키워드가 적용된다.

 

추상 클래스 

[추상]메소드가 포함된 클래스이다 

[abstract] 키워드를 사용한다. 

 

+ 표현식 +

접근제한자 abstract class 클래스명{}

 

 


 

 

연습 문제 :    


@ 아래 코드에서 누락되거나 잘못된 부분을 찾아 채워보자.

 // 추상 클래스 Sports 선언
 abstract class Sports {

//  : O 


 // 추상 메소드 play 선언
 public abstract void play() ;

// abstract는 맞음 ,     추상메소드 {}중괄호 생략 안함 

// 추상메소드는 중괄호가 아닌 ()매개변수 정보부분에 세미콜론 ; 
 
 // 메소드 prepare 선언
 public void prepare() {
   System.out.println("Preparing for the game..");
 } 
 }
 
 // 인터페이스 TeamSport를 선언
 interface TeamSport      {
 // 추상 메소드 teamMembers 선언
 void teamMembers();
 } // 묵시적 추상 메소드 몸통이 없다. 
   // O
 /

/ Soccer 클래스는 Sports를 상속하고 TeamSport 인터페이스를 구현
 class Soccer extends Sports implements TeamSport {
   

// play 메소드 구현
   public void play() {
     System.out.println("Playing soccer!");
   } // O
   // 오버라이딩 시 접근제한자는 동일하거나 더 큰 범위를 사용해야 한다. 
   // teamMembers 메소드 구현
   public void teamMembers() {
     System.out.println("Soccer team has 11 players.");
   } // 변한거 없음 
 }
 
 // Basketball 클래스는 Sports를 상속하고 TeamSport 인터페이스를 구현
 class Basketball extends Sports implements TeamSport {
   // play 메소드 구현
   public void play() {
     System.out.println("Playing basketball!");
   } // 
   
   // teamMembers 메소드 구현
   public void teamMembers() {
     System.out.println("Basketball team has 5 players.");
   } // 
 }
 
 // Main 클래스
 public class Main {
   public static void main(String[] args) {
     // 다형성을 사용하여 Sports 타입의 배열 생성
     // Sports[] sportsList = new Soccer[3];

         

       sportsList[0] = new Score();

       sportsList[1] = new Basketball;

     

 


     // 모든 Sports 객체의 play와 prepare 메소드 호출

        for(int i  = 0; i < sportsList.length; i++){

         sportsList[i].play(); 

          sportsList[i].prepare();

}
     
     // 다형성을 사용하여 TeamSport 타입의 배열 생성
     

        TeamSport [] team = new TeamSport tsList[2]

           

              

 

                 team[0] = new Soccer();

                team[1] = new Basketball();

      

 

 


     // 모든 TeamSport 객체의 teamMembers 메소드 호출

       

                for(TeamSport sport : team){

                tsList.teamMembers();

}

 


   }
 }
 -----------------------------------------------------

 


 

 

추상클래스와 인터페이스는 인스턴스화할 수 없다.

즉 new 추상클래스(); or new 인터페이스();

와 같이 객체를 직접 생성할 수 없다 

 

하지만 추상 클래스를 상속한 구체 클래스나 인터페이스를 구현한 클래스의 객체는 

생성할 수 있다 

 

추상 클래스나 인터페이스 타입의 배열을 생성하고 그 배열을 구체 클래스의 

인스턴스를 저장할 수 있다 이를 통해 다형성을 활용할 수 있다. 

 

인터페이스 구현 시 추상메소드를 재정의를 해야된다.

아니면 추상 클래스로 인식이 된다. 

 

예외 처리 : 

프로그램의 비정상 종료를 방지하고, 오류 발생 시 적절한 

대응을 하기 위해 필요하다 

 

사용자 정의 예외클래스 

 

Exception 상속하기 

extends Exception 

생성자 : 기본 생성자 

매개변수 생성자(String msg){

super(msg)

}

 

 

        Scanner sc = new Scanner(System.in);

          System.out.print("ID : ");
          String id = sc.next();

          System.out.print("PW : ");
          String pwd = sc.next();

          // 발생시킨 예외 관련 예외처리
          try {
              if (checkId(id) && checkPwd(pwd)) {
                  System.out.println("로그인 성공!");
              }
          } catch (LoginValidException e) {
              e.printStackTrace();
          }
      }

      // throws 예외클래스명 : 해당 메소드 호출 위치로 예외를 전달(위임)
      public static boolean checkId(String id) throws LoginValidException {
          if (id.length() >= 6 && id.length() <= 15) {
              return true;
          }

          // 위 조건에 해당되지 않는 경우 잘못된 로그인 정보에 대한 예외 발생!
          // * throw new 예외클래스명(메시지);
          throw new LoginValidException("아이디가 잘못되었습니다.");
      }

      public static boolean checkPwd(String pwd) throws LoginValidException {
          if (pwd.length() >= 8 && pwd.length() <= 20) {
              return true;
          }

          // 위 조건에 해당되지 않는 경우 잘못된 로그인 정보에 대한 예외 발생!
          throw new LoginValidException("비밀번호가 잘못되었습니다.");
      }
  }
------------------------

 

 


 

 

입출력(IO) : 

자바에서 IO는 [스트림](stream)을 통해 이루어진다.

[종류]

[1] [바이트 (기반) 스트림] : 바이트 단위로 데이터를 읽고 씀 

 

+ 최상위 클래스로 InputSteam(입력) 클래스와 OutputStream(출력) 클래스가 있다 

+ 이진 데이터, 네트워크 통신 시 주소 사용된다. 

 

[문자 (기반)스트림 ] : 문자 단위로 데이터를 읽고 쓴다. 

+ 최상위 클래스로[Reader(입력)] 클래스와 [Writer(출력)] 클래스가 있다 

텍스트 데이터, 인코딩 변환 시 주로 사용한다. 

 

IO관련 최상위  예외 클래스 - > IOException

 

바이트스트림만 존재 : 

 

DataInputStream

DataOutputStream

 

ObjectInputStream

ObjectOutputStream

대상 객체에 직렬화(Serializable)

implements () 인터페이스를 구현해야 된다.

 

바이트 스트림 --> 문자스트림 변환 : 

InputStreamReader OutputStreamWriter

 

문자 출력 스트림 : printWriter

 

 

import java.io.*;

public class Main {

    public static void main(String[] args) {

     // 깊은 복사 방법 복사본 배열 = 원본배열.clone()

        // Serializable

        InputStream is = System.in;
        OutputStream os = System.out;

    byte[] but = new byte[1024];

 

 

import java.io.*;

 

 

 

 

try-with-resources 사용 : 

try-with-resources 구문을 사용하면 자원을 자동으로 해제할 수 있어 

코드가 더 간결하고 안전해진다. 

 

명시적으로 close 메소드를 호출할 필요가 없다. 

 

 

import java.io.*;

public class Main {

    public static void main(String[] args) {

     // 깊은 복사 방법 복사본 배열 = 원본배열.clone()

        // Serializable

        InputStream is = System.in;
        OutputStream os = System.out;

    byte[] but = new byte[1024];
    int len = 0;

    // IOExection이 발생한다
        try {


            while((len = is.read(but)) != -1) {
                // 더 이상 읽을 데이터가 없음 
                os.write(but, 0, len);
                os.flush();

            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if (os != null)os.close();
                if (is != null)is.close();

            }catch (IOException e){
                e.printStackTrace();
            }
        }

 

 

try - with - recources 문을 사용을 하면 자동으로 자원해제가 된다. 

 

파일이 존재하는 지 여부 exists() 메소드를 사용 

 

출력 시 flush() 메소드를 사용하는게 좋다. 

 

 

ClassNotFoundException은 파일에서 직렬화된 객체를 읽어올 때 해당 클래스 정의를 찾을 수 없을 때

발생할 수 있습니다.

이를 방지하려면 클래스패스를 올바르게 설정하고, 클래스 정의를 변경하지 않도록 주의해야 합니다.

 

// implements Serializable - 직렬화 import해야된다 java.io.*; 패키지

 

 

 

class Parent {
    public void show() {
        System.out.println("Parent class method");
    }
}

class Child extends Parent {
    @Override
    public void show() {
        System.out.println("Child class method");
    }
}

public class Main {
    public static void main(String[] args) {
        // 부모 클래스 참조 변수로 자식 클래스 객체를 참조
        Parent parentRef = new Child();
        parentRef.show(); // 출력: Child class method

        // 자식 클래스 참조 변수로 부모 클래스 객체를 참조하려고 시도 (컴파일 오류)
        // Child childRef = new Parent(); // 컴파일 오류 발생
    }
}