[LG 유레카] 생성자, 인터페이스
생성자
생성자Constructor
새로운 객체를 생성하기 위해서 초기화 해주는 메서드
-
일반 메소드와의 차이점
- 생성자의 이름은 반드시 클래스명과 일치한다.
- 리턴자료형을 명시하지 않는다.
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
-
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) 필드에서 선언된 값을 생성자에서 초기화 } }
-
-
-
final 리턴형 메서드명() {}
메소드 재정의 불가
마지막 메서드 : 오버라이딩(메소드 재정의) 할 수 없는 메서드.
-
final class 클래스명{}
- 마지막 클래스 : 자식클래스를 갖지 않는 클래스
- 완벽한 클래스(자식통한 기능확장을 원치 않는다)
- 보안, 설계
추상클래스
-
추상클래스abstract class
클래스를 보통 설계도에 비유하는데 그렇다면 추상 클래스는 미완성 설계도이다.
💚 추상메서드: 선언부만 있고 구현부(몸통, body)가 없는 메서드
-
후손 class를 제어할 목적으로 사용.
-
객체화 될 수 없는 클래스
-
구현(정의)된 메서드와 선언된 메서드로 구성.
-
완성된 설계도가 아니기 때문에스스로 객체생성 불가(new 사용X), 후손class 객체생성(자식은 부모다)해서 사용.
abstract class 클래스명{ //필드선언 public void hello(){}//구현된(정의된) 메서드 abstract void print();//선언된 메서드 ※주의: 선언된 메서드를 사용하는 경우 반드시 abstract 명시!! }
-
오버라이딩
오버라이딩이란?
조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다.
➡메서드 재정의
- 규칙
- 접근 제한자는 부모와 같거나 확장되어야 함
- 부모: default ➡ 자식: default ,protected,public
- 부모: protected ➡ 자식: protected,public
- 부모: public ➡ 자식: public
- throws 예외 클래스는 부모와 같거나 축소되어야 함
- 접근 제한자는 부모와 같거나 확장되어야 함
Abc a = new Abc( );
-------
기본생성자 호출!!
a.hello();
Abc a2 = new Abc("길동");
------------
오버로딩생성자 호출!!
a2.hello();
-
미션⭐
BufferedReader클래스의 readLine()메서드를 호출하시오.
접근제한자
-
접근지정(제한)자 AccessControl
-
접근(호출, 사용)범위
-
public
모든 클래스(같은, 다른패키지)에서 접근 허용
- 서로 다른 패키지에서도 접근가능
-
protected
같은 패키지내의 클래스와 다른 패키지의 자식 클래스 접근 허용
- 서로 같은 패키지에서 접근가능, 만약 상속관계를 갖는다면 다른 패키지라도 자식이 부모를 참조
-
default(생략)
같은 패지키지내의 클래스간 접근허용
- 서로 같은 패키지에서 접근가능
-
private
클래스내에서 멤버간에만 접근허용
- 같은 클래스 내에서만 (멤버끼리만) 접근가능
-
-
-
접근지정자 위치
-
필드
[접근지정자4개] 자료형 변수명;
-
메소드
[접근지정자4개] 리턴자료형 메소드명( ){}
-
클래스
[접근지정자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};
➡ 정수 배열을 오름차순 정렬하시오.
미션2
char[]ch= {‘J’,’a’,’v’,’A’};
String[]names= {“홍길동”,”길라임”,”김주원”};
➡ 문자,문자열 배열을 오름차순 정렬하시오.
-
내림차순 정렬
Array.sort(su,Collections.reverseOrder());
미션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이름의 오름차순 정렬하시오.
-
Collections.sort()
-
배열의 원소를 정렬: Arrays.sort()메소드 사용
-
ArrayList의 원소를 정렬: Collections클래스의 sort()메소드를 이용해서 정렬
[출처: 홍뉴홍로그]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
메서드는 이름을 기준으로 정렬할 때 사용된다. -
-
댓글남기기