5 분 소요

생성자

생성자Constructor

새로운 객체를 생성하기 위해서 초기화 해주는 메서드

  • 일반 메소드와의 차이점

    1. 생성자의 이름은 반드시 클래스명과 일치한다.
    2. 리턴자료형을 명시하지 않는다.void도 ❌
  • 객체생성시 자동으로 호출

  • 클래스 내에 생성자가 하나도 없다면 자바 컴파일러가 컴파일시 자동으로 기본생성자를 추가

    • 기본생성자는 변수 선언이 하나도 안 들어간 것을 기본 생성자라고 한다.

      ❗ 만약, 클래스 내에 한 개 이상의 생성자가 정의 되어 있다면 컴파일러는 소스코드에 관여안함

      class Abc{
          int su;
          My my;
          Abc(){ //기본생성자(매개변수 비어있는 생성자) --> 초기화(값할당) 메소드
              //멤버필드에 대한 초기화 작업
              su =10;
              my = new My();
              //(일반 메소드 호출 전 1번 실행하는)선행작업
          }// 생성자
          Abc(String name){//오버로딩 생성자
          }
          ABc(int age){
              //컴파일 에러 발새이 클래스명과 일치하지 않으므로 일반 메소드
              //리턴 자료형을 명시하지 않았음
          }
          void hello(){
          }
      }//class Abc
      

인터페이스

인터페이스란 일종의 추상 클래스로 추상메서드와 상수만을 멤버로 가질 수 있고 실제 구현된 것이 전혀없는 기본 설계도 이다.

interface 인터페이스 {
    //필드
    [public static final] int su;
    
    //선언된 메서드
    [public abstract] void print();
}
======================================
interface A{
    int su;
    void print();
}

=> 저장: 인터페이스명.java --컴파일--> 인터페이스명.class

final 클래스는 서브클래스를 가질수 없다. 즉 부모로 삼을 수 없다는 것이다.

  • 인터페이스의 구성멤버는 필드, 선언된 메서드로만 구성

    void print(){
    } //정의된 메서드, 구현된 메서드
      
    void print(); //선언된 메서드(바디가없는, 영역괄호 없는 메서드)
    
  • 이해를 돕기 위한 비유

    • 손님의 입장

      • 서로 다른 제품에 연결할 수 있는 공통 연결 모듈을 의미
    • 요리사의 입장(객체를 생성하는 곳)

      • 클래스에 다중 상속을 구현할 수 있다.

        ⭐ 인터페이스 사용법

        ​ 클래스에 구현해서 사용한다.

        • 키워드: implement

          	class 클래스명 implement 인터페이스명{
          //  	주방		구현의 약속	  메뉴판 
                      
          	}
          

클래스와 인터페이스 간의 상속문법

class A{}

class B extends A{
    //extends 뒤에는 상속 받고자 하는 한개의 클래스명만 정의
}
  • extends :확장
    • 자식클래스 확장하는 클래스
interface A{}
interface B{}

class C implements A,B{// A와 B인터페이스내의 선언된 메서드를 C클래스에서 전부 구현!!
        //구현의 약속
}
interface A{}
class B{}

class C implements A  extends  B { 
   //에러발생: 클래스와 인터페이스를 동시에 상속할 때는 클래스 먼저, 인터페이스 나중
   //implements가 먼저 나오면 컴파일러가 extends Object를 implements키워드 앞에 추가해줌!! 
} ---> (X)

class C extends  B  implements A  {
 
} ---> (O)
interface A { void hello(); }
interface B { void hi(); }

interface C  extends  A,B{
   void good();
}
class A {  void  hello(){}   }

interface B         A{

} ----> 말이 안됨!!

final

  1. final 자료형 변수명

    • 마지막 변수: 상수(constant)

    • 상수의 식별을 위해 전체 대문자 표기

      • ex)

        final int MAX = 100;
        // MAX++; ➡ 101 : 에러발생 
        //MAX=200; ==>에러발생
           class My{
              final int MAX;  ==> 에러발생
              final int MAX = 200;  ==> 방법1) 선언과 동시에 초기화
              My(){
                 MAX=100;  ==> 방법2) 필드에서 선언된 값을 생성자에서 초기화
              }
           }
        
  2. final 리턴형 메서드명() {}

    메소드 재정의 불가

    마지막 메서드 : 오버라이딩(메소드 재정의) 할 수 없는 메서드.

  3. final class 클래스명{}

    • 마지막 클래스 : 자식클래스를 갖지 않는 클래스
    • 완벽한 클래스(자식통한 기능확장을 원치 않는다)
    • 보안, 설계

추상클래스

  • 추상클래스abstract class

    클래스를 보통 설계도에 비유하는데 그렇다면 추상 클래스는 미완성 설계도이다.

    💚 추상메서드: 선언부만 있고 구현부(몸통, body)가 없는 메서드

    • 후손 class를 제어할 목적으로 사용.

    • 객체화 될 수 없는 클래스

    • 구현(정의)된 메서드와 선언된 메서드로 구성.

    • 완성된 설계도가 아니기 때문에스스로 객체생성 불가(new 사용X), 후손class 객체생성(자식은 부모다)해서 사용.

        abstract class 클래스명{
            //필드선언    
                
            public void hello(){}//구현된(정의된) 메서드
            abstract void print();//선언된 메서드
            주의: 선언된 메서드를 사용하는 경우 반드시 abstract 명시!!
        }
      

오버라이딩

오버라이딩이란?

조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것오버라이딩이라고 한다.

메서드 재정의

  • 규칙
    1. 접근 제한자는 부모와 같거나 확장되어야 함
      • 부모: default ➡ 자식: default ,protected,public
      • 부모: protected ➡ 자식: protected,public
      • 부모: public ➡ 자식: public
    2. throws 예외 클래스는 부모와 같거나 축소되어야 함
  Abc a = new Abc(  );
               -------
	       기본생성자 호출!!
      a.hello();


   Abc a2 = new Abc("길동");
               ------------
	       오버로딩생성자 호출!!
      a2.hello();
  • 미션⭐

    BufferedReader클래스의 readLine()메서드를 호출하시오.

접근제한자

  • 접근지정(제한)자 AccessControl

    • 접근(호출, 사용)범위

      • public

        모든 클래스(같은, 다른패키지)에서 접근 허용

        • 서로 다른 패키지에서도 접근가능
      • protected

        같은 패키지내의 클래스와 다른 패키지의 자식 클래스 접근 허용

        • 서로 같은 패키지에서 접근가능, 만약 상속관계를 갖는다면 다른 패키지라도 자식이 부모를 참조
      • default(생략)

        같은 패지키지내의 클래스간 접근허용

        • 서로 같은 패키지에서 접근가능
      • private

        클래스내에서 멤버간에만 접근허용

        • 같은 클래스 내에서만 (멤버끼리만) 접근가능
  • 접근지정자 위치

    1. 필드

      [접근지정자4개] 자료형 변수명;

    2. 메소드

      [접근지정자4개] 리턴자료형 메소드명( ){}

    3. 클래스

      [접근지정자2개-public/default] class 클래스명{}

super

- 참조변수

  • this

    • 자기참조 연산자, 인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어있다.

    • 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

      super.필드명
      super.메소드명();
      super( ); //부모클래스 생성자 호출
      
      • 생략하는 this

        public class A{
            int su=300;
                  
            publicvoid hello(){
                print();		//this.print();
            }
            public void print(){
                System.out.println(su); 	//System.out.println(this.su);
                         
            }
        }
        
      • 명시하는 this

        pulic class Abc{
            int su;
            public Abc(){ //*1  기본생성자 
                this(100);
            }
            public Abc(int su){ *2
                this.su=su;
            }
            public void hello(){
                      
            }
        }
        ======================================
        Abc a =new Abc();
        System.out.println(a.su); //0
              
        Abc a =new Abc(500);
        System.out.println(a.su); //500
              
        
  • super

    • this와 같으며, 조상의 멤버와 자신의 멤버를 구별하는 데 사용한다.

    • 메소드 내에서 사용

    • 객체 생성자내에서 다른 생성자를 호출시 사용

    • 매개변수(지역변수)와 멤버변수(필드)를 구분하기 위해 멤버변수 앞에 this.를 붙여 사용

          this.필드명
          this.메소드명();
          this( ); //생성자 호출
      

미션 🔥

미션1

int[]su= {13, 8, 7, 10, 100, 5};

➡ 정수 배열을 오름차순 정렬하시오.

image-20240613170405329

미션2

char[]ch= {‘J’,’a’,’v’,’A’};

String[]names= {“홍길동”,”길라임”,”김주원”};

➡ 문자,문자열 배열을 오름차순 정렬하시오.

image-20240613171350100

  • 내림차순 정렬

    Array.sort(su,Collections.reverseOrder());

    image-20240614112409907

미션3

Person p = new Person(“갓길동”,11,”학생”,95);

Person[] persons= {p ,

​ new Person(“빛길동”,19,”학생”,80),

​ new Person(“남길동”,14,”학생”,100),

​ new Person(“여길동”,17,”학생”,99),

​ new Person(“킹길동”,15,”학생”,56)};

==> Person이름의 오름차순 정렬하시오.

image-20240613170450807image-20240613170515516

  • Collections.sort()

    • 배열의 원소를 정렬: Arrays.sort()메소드 사용

    • ArrayList의 원소를 정렬: Collections클래스의 sort()메소드를 이용해서 정렬

      image-20240613173109988

      [출처: 홍뉴홍로그]https://hongnewhonglog.tistory.com/31

    Collections클래스는 sort()메소드를 오버로딩한다.

    전자의 sort()메소드는 Comparable인터페이스를 구현한 클래스로 타입을 제한한 리스트를 인자로 받는다.

    후자의 sort()메소드느 리스트와 함께 Comparator를 받는다.

  • Comparable인터페이스

    Comparable 인터페이스에는 단 하나의 메소드가 존재 ➡compareTo()메소드

    • compareTo() 메소드

      정렬 기준을 결정하는 메소드, 정렬을 위해서 compareTo() 메소드가 정의되어 있어야한다.

      ➡ Comparable 인터페이스를 구현하지 않아서 compareTo()메소드를 가지고 있지 않은 클래스는 natural ordering이 존재하지 않아서 정렬 불가능

  • compareTo 메서드를 재정의하여 이름(name)을 기준으로 정렬

    Person 타입은 String 타입과 int타입의 변수를 둘 다 가지고 있어서 어느 기준으로 정렬 되어야하는지 명확하지 않아 에러가 발생한다.

    기준을 설정해주기 위해서 compareTo()메소드를 갖는 Comparable 인터페이스를 구현한 클래스 타입으로 만들어준다.

    public class Person implements Comparable<Person> {
        String name;
        int age;
        String job;
        int year;
          
        public Person(String name, int age, String job, int year) {
            this.name = name;
            this.age = age;
            this.job = job;
            this.year = year;
        }
          
        @Override
        public int compareTo(Person other) {
            return this.name.compareTo(other.name);
        }
    
    • compareTo() 메서드

      이 메서드는 Comparable 인터페이스의 compareTo 메서드를 구현한 것이다.

      ➡ 두 개의 Person 객체를 비교하여 정렬 순서를 결정하는 데 사용

      • compareTo 메서드는 두 Person 객체의 이름(name)을 비교해서 정렬 순서를 결정

        이 메서드는 문자열의 compareTo메서드를 사용하여 이름을 비교한다.

      • this.name.compareTo(other.name)

        현재 객체(this)와 다른 객체(other)의 이름을 비교하고 compareTo메서드는 문자열을 비교한 후에 결과에 따라 음수, 0, 양수를 반환한다.

        • 음수

          현재 객체(this)가 다른 객체(other)보다 작음

        • 0

          현재 객체(this)와 다른 객체(other)가 같음

        • 양수

          현재 객체(this)가 다른 객체(other)보다 큼

      따라서 compareTo 메서드는 이름을 기준으로 정렬할 때 사용된다.

업데이트:

댓글남기기