✅Java 기초 4,5일차

이상민·2023년 7월 13일
0

Java 기초문법

목록 보기
5/7

📗정렬

버블정렬

앞의 두요소 비교하여 왼쪽값이 더 크면 교환, 끝까지 돌고 맨 마지막 요소빼고 다시 정렬반복
-> 오름차순 정렬된다.


for(int i = len; i>0; i--){
 	for(int j = 0; j<5; j++){
    	if(lotto[j]<lotto[j+1]){
        	temp = lotto[j];
            lotto[j+1] = lotto[j];
            lotto[j]=temp;
        }
    }
}

선택 정렬

최솟값을 찾아 맨앞의 요소와 바꾼다. 처음위치를 빼고 반복한다.

 for(int i = 0; i<length;i++){
             max = 0;
             for (int j = i ; j < length; j++) {
                 if (lotto[j] > max) {
                     max = lotto[j];
                     lotto[j] = lotto[i];
                     lotto[i] = max;
                 }
             }
         }

->내림차순 정렬이라 max 사용 큰값을 맨 앞으로 정렬한다.

📗상속

  1. 부모(super) class의 속성(전역변수 = Field)와 method를 상속 받는 것.
  2. 부모 class의 생성자와 private요소를 제외한 모든것을 상속받는다.
  3. 부모 class의 method와 속성을 별도 선언 없이 접근하여 사용.
  4. 부모는 한명만, 단일상속만 가능

상속관계일때 생성자 개념

  1. 자식 class가 생성될 때 부모 class의 기본 생성자 호출된다.
  2. 자식 class 생성자 구현부에 super();생략된 형태
    child(4), child(true), child("string")등 어떤형태의 생성자 호출해도 parent()생성자 호출된다
    ※parent(4),parent(true)호출 아님 무조건 parent()만 호출
  3. 부모class에 생성자 없으면 기본생성자 자동 삽입(안보일뿐)
    부모class에 기본생성자 없이 인수생성자만 있다면, 하위클래스에서 생성자 호출시 생략된 super();에서 에러가 난다.
    ※따라서 this(4);나 super(4); 이런식으로 명시적으로 지정해줘야한다.

this vs super

this는 같은 class내의 다른메서드(생성자)호출할 때
super는 상위 class의 메서드(생성자) 호출할 때

다형성

  • 상속관계일때 성립
class A extends B{}
B b = new A():
  • A를 A라 부를 수 있고, A를 B라 부를수 있다.
  • 부모타입 참조변수로 자식타입 객체 참조 할 수 있다.
    이때 b는 A클래스에만 있는 고유 메소드, 속성은 호출 및 사용 불가
    B클래스(부모)에 있는 메소드, 속성만 사용할 수 있다.

📢※ 하지만 A클래스에서 B클래스 메서드 재정의한 메서드인 경우 b는 A의 재정의된 메소드를 호출한다.(기존의 B클래스 메서드는 은닉되어 바로접근 불가. A클래스 재정의된 메서드에서 기존 B클래스 메서드 호출해서 접근해야함)

A a = (A)b;
  • A클래스로 형변환해서 사용이 가능하다.
public void engineer(Car cd){
		// if문으로 들어온 타입이 어떤 자식 타입인지 물어봐서 그에 맞는 캐스팅으로 해준다
		if(cd instanceof EfSonata) { //오른쪽 타입이 왼쪽과 같거나 super 타입이면 true 반환
			EfSonata efs = (EfSonata) cd;
			System.out.println("efs의 주소: " + efs);
			System.out.println("efs.i = " + efs.i);
		}
		System.out.print(cd.carname+" 수리완료!\t");
		System.out.println("청구비용"+cd.cost+" 원");
		
	}
  • 만약 상위 타입을 인수로 받는 메소드가 하위타입을 인수로 받을때, instanceof를 사용해서 해당 하위타입과 맞는지 확인하여 형변환 한다.

instanceof

  • 왼쪽변수가 오른쪽의 타입이 될 수 있나?
    왼쪽 < 오른쪽 일때, true 반환

Overriding

  1. 접근 제한자는 반드시 부모class의 제한자보다 크거나 같아야한다.
  2. 다른거 다 같아야하고 기능만 다르게 만들어야한다.

@override: 오버라이딩한 메서드를 알려주는 어노테이션 (없어도 되지만 컴파일러와 개발자에게 명시적으로 알려주며, 더빠르게 실행된다.)

String

toString

print는 (변수.toString())로 되어있지만 toString이 생략된 형태이다.
Object.toString()은 주소값을 나타내는 메서드
String.toString()은 문자열을 출력해주는 메서드(object 메서드 오버 라이딩)

String str;
	public String(String str){
		this.str=str;
	}
	public String toString(){
		return str;
	}

String 클래스에 이런식으로 재정의 되어있다.
String s03=new String("월요일");
월요일->생성자->전역변수->toString메서드->return

equals

Object.equals(==과 같은 기능) 주소값을 비교한다.
String.equals(문자열 비교 기능) 문자열을 비교한다.

String은 constant이므로 변경 불가 하다.
str = "문자열"
str = "문자열2"
->이거는 객체를 새로생성하는거지 변경하는게 아니다.
변경은 StringBuffer, StringBuilder등을 사용한다.

public class MainApp {
	public static void main(String[] args) {
		ElecFunction elec[] = new ElecFunction[5];

		elec[0] = new Tv("A01", 500000, 12);
		elec[1] = new Tv("A02", 2500, 20);
		elec[2] = new Tv("A03", 3000, 30);

		elec[3] = new Audio("A04", 8500, 200);
		elec[4] = new Audio("A05", 700, 100);

		for (ElecFunction e : elec) {
			System.out.println(e);
		}
	}
}

TV, Audio클래스는 Elec 클래스를 상속받고, Tv, Audio에서 각기 다른 toString메서드를 재정의하여 사용중이다.
elec[1] = new Tv("A02", 2500, 20);
이코드를 보면 부모타입이 자식타입 객체를 참조하고 있지만, 자식타입의 toString메서드를 사용하고 있다.
앞선 enginner 예제에서는, 부모타입은 자식타입의 메서드를 사용할 수 없어서 형변환을 통해 사용하였다.
이 코드는 어떻게 형변환 없이 사용할 수 있었을까?
📢 재정의한 메소드는 부모타입에서 사용하더라도, 재정의한 메소드를 호출하기 때문이다.

📗final, abstract

final

상수: 고정값, 값변경 불가
static final int a = 10;

  • 생성자에서 초기화 안됨.

변수

final 변수

  • 값변경 불가
final int a;
Test(int a){
	this.a=a;
}
new Test(10);
new Test(20);
  • 생성자를 이용하여 임의의값으로 초기화 가능

메서드

  • final 메서드는 재정의 불가함

클래스

  • final 클래스는 상속 불가

abstract

변수

  • 변수 앞에 사용불가

메서드

  • 선언부만 있고 구현부 없다(기능 없음)
    서브 class에서 재정의하기 위해 존재할 뿐
  • abstract 메서드 가지고 있는 class는 반드시 abstract class로 선언해야 한다.

클래스

  • abstract 클래스는 생성불가(new사용 불가)
    다른 class의 부모가 되기 위한 존재

📗interface

  • class와 유사하지만 class가 아님 -> 상속, 생성불가
  • interface의 모든 속성,메서드는 abstract 메서드이다.
  • 상속은 안되지만, implements라고해서 구현한다 라고 표현한다.
    다중상속이 가능하며, 상속처럼 사용가능
  • 안쓰는 메서드이더라도 implements 하는 interface내의 모든 메서드 재정의 해야한다.
profile
개린이

0개의 댓글