Day 32 (23.02.09)

Jane·2023년 2월 9일
0

IT 수업 정리

목록 보기
34/124

1. Object 클래스와 상속 관계

1-1. 객체를 생성하면 주소값을 출력

예시

class A{}

class JavaPractice {

	public static void main(String[] args) {
		A a = new A();
		System.out.println(a);

	}
}

PrintScream 클래스 > println(Object x)
(객체가 Object를 자동 상속하므로, 다형성이 적용되었다.)
String은 valueOf() 대입한다.

public void println(Object x) {
	String s = String.valueOf(x);
	synchronized (this) {
		print(s);
		newLine();
	}
}

String 클래스 > valueOf(Object obj)
안의 값이 null이면 null, 아니면 toString() 리턴

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

Object 클래스 > toString()
해당 클래스의 이름 + "@" + 정수를 16진수로 뿌리기(주소값)

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

1-2. String 객체 생성

  • String 객체를 생성하면, 주소값이 나오지 않고 Overriding을 통해서 String을 리턴한다.
class JavaPractice {

	public static void main(String[] args) {
		A a = new A();
		System.out.println(a);
		
		String str1 = "aaa";
		System.out.println(str1);
		
		String str2 = new String("abc");
		System.out.println(str2); // toString의 Overriding

	}
}

[Console]
A@4926097b
aaa
abc

이 코드에서 class A에 코드를 추가한다.


class A extends Object{
	@Override
	public String toString() {
		return "toString()";
	}
	

}

class JavaPractice {

	public static void main(String[] args) {
		A a = new A();
		System.out.println(a); // toString의 Overriding
		
		String str1 = "aaa";
		System.out.println(str1);
		
		String str2 = new String("abc");
		System.out.println(str2); 

	}
}

[Console]
toString()
aaa
abc


String 클래스 > toString()

    public String toString() {
        return this;
    }

2. @ (annotation / 주석)

2-1. 개요

  • Java 1.5버전부터 지원
  • 컴파일러에게 얘기한다.
  • 있든 말든 프로그램 자체에 영향을 주지는 않는다.
  • @ 자체가 하나의 기능 (함수 역할)

2-2. @Override

  • 상속 관계일 때 사용
  • 부모에 있는 함수를 (똑같은 이름이 있는지) 체크한다.
  • 체크한 함수가 존재하지 않으면 컴파일 에러를 낸다.

3. 인터페이스

3-1. 인터페이스란?

  • 인터페이스 안에는 상수(final)만 올 수 있다. 변수는 올 수 없다.
    abstract 함수 : 내용물이 없는 함수, 추상 함수
  • 인터페이스를 만들고 클래스에 implements로 상속해주면 구현할 수 있다.
  • 인터페이스도 다형성을 적용할 수 있다.
  • 인터페이스는 상속받은 자식 클래스가 구현해야 한다.

3-2. 출력 인터페이스 연습


interface Printable{
	public abstract void print(String doc);
    // 인터페이스에 public abstract 를 적지 않아도 자동적으로 넣어준다.	
}

class Printer implements Printable{
	public void print(String doc) {
		System.out.println(doc);
	} // 자식의 클래스에서 Overriding
}


class JavaPractice {

	public static void main(String[] args) {

		Printable prn = new Printer();
		prn.print("HELLO java");
	}
}

[Console]
HELLO java

3-3. 계산기 인터페이스 만들어보기


interface ICalculator {
	public abstract int add(int num1, int num2);

	public abstract int sub(int num1, int num2);

	public abstract int mul(int num1, int num2);

	public abstract double div(int num1, int num2);
}

class MyCalculator implements ICalculator {

	@Override
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int sub(int num1, int num2) {
		return num1 - num2;
	}

	@Override
	public int mul(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public double div(int num1, int num2) {
		if (num2 == 0) {
			System.out.println("div error");
			System.exit(0);
		}
		return (double)num1 / num2;
	}

}

class JavaPractice {

	public static void main(String[] args) {
		ICalculator cal = new MyCalculator();
		System.out.println(cal.add(10, 20));
		System.out.println(cal.sub(10, 20));
		System.out.println(cal.mul(10, 20));
		System.out.println(cal.div(10, 20));
		System.out.println(cal.div(10, 0));
	}
}

[Console]
30
-10
200
0.5
div error

4. String 문자열이 더해지는 과정

String str = "age: " + 17;

4-1. 문자열 합치기에 사용되는 + 연산자의 사용

  • Java 1.5 버전 이후로는 + 연산자로 문자열을 더하는 방식이 모두 StringBuilder로 동작되도록 방식이 바뀌어졌다고 한다.
StringBuilder s = new StringBuilder("age: ");
System.out.println(s.toString());
		
s.append(17);
System.out.println(s.toString());

StringBuilder 클래스 > StringBuilder 생성자 함수

public StringBuilder(String str) {
	super(str.length() + 16);
	append(str);
}
  • StringBuilder()에는 오버로딩이 적용되었다. >> 매개변수 : 없음, int, String, CharSequence
  • super() 가 존재하므로, StringBuilder는 누군가의 자식 클래스이다.
    (public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable, CharSequence)
    • 부모 클래스 : AbstractStringBuilder
    • 인터페이스 : java.io.Serializable, Comparable, CharSequence

4.2 StringBuilder에서 문자열 붙이기

StringBuilder() 클래스 > append()

  public StringBuilder append(Object obj) {
	return append(String.valueOf(obj));
 }
  
public StringBuilder append(String str) {
	super.append(str);
	return this;
}

4-3. StringBuilder의 부모 클래스 AbstractStringBuilder

AbstractStringBuilder 클래스

abstract class AbstractStringBuilder implements Appendable, CharSequence {
	byte[] value;
	byte coder;
	int count;

	@Override
    public int length() {
        return count;
    }
  
  
  	public AbstractStringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }
}
  • append()에 오버로딩이 적용되었다. (Object, String, StringBuffer, AbstractStringBuilder, CharSequence)
  • String.valueOf()를 리턴한다.
  • String.valueOf()는 null이면 null을 리턴하고, null이 아니면 toString()을 리턴한다.

4-4. AbstractStringBuilder가 implements로 가리키고 있는 인터페이스

Appendable 인터페이스

public interface Appendable {
	Appendable append(CharSequence csq) throws IOException;
	Appendable append(CharSequence csq, int start, int end) throws IOException;
	Appendable append(char c) throws IOException;
}

CharSequence 인터페이스

profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글