[Day 09] Java 0407 - 내용 정리

Doyeon Kim·2022년 4월 7일
1

Java

목록 보기
11/16
post-thumbnail

🌞추상클래스와 추상메소드

  • 추상메소드는 미래에 후손클래스들이 반드시 가져야 할 메소드이지만 부모클래스를 만드는 시점에서 구체화할 수 없는 경우 메소드 몸체를 정의하지 않고, 메소드 선언문만 명시한다. 이것을 "추상메소드" 라고 하고 메소드 이름 왼쪽에 abstract 키워드를 써준다.
  • 이와같이 추상메소드를 하나라도 포함하고 있는 클래스를 "추상클래스"라고 하고, 클래스 이름 왼쪽에 abstract 키워드를 써준다.
  • 추상클래스는 추상메소드 뿐만 아니라 body가 구체화된 메소드를 포함할 수 있다.
  • 또한, 추상클래스는 body를 구체화 하지 않는 메소드를 포함하고 있기 때문에 추상클래스의 객체는 생성할 수 없다.
  • 반드시 그 추상클래스를 상속받아 추상메소드를 구현한 클래스의 객체를 생성해야 한다.

🌞익명클래스

  • 이름없는 클래스를 의미한다.
  • 추상클래스를 상속받은 클래스를 정의하는데 따로 이름을 정해주지 않고 바로 추상메소드를 오버라이딩한 클래스를 만들면서 객체를 생성할 대 사용한다.

🌞다중상속

  • 객체지향 프로그래밍 중의 하나인 c++에서는 클래스의 다중상속이 가능하다.
(c++)

class A {
		public void pro() {
		}
	}
	
	class B {
		public void pro() {
		}
	}
	
	class C : A,B //다중 상속이 가능하다.
 	{
	
	}
	
	C ob = new A();
	ob.pro(); //부모 A의 pro를 호출해야 할지, B의 pro를 호출해야할지.. 오류가 발생하게 된다.
	
  • 이러한 문제점때문에 java에는 클래스의 다중상속을 금지시키고 있다.

🌞인터페이스

  • 다중상속의 효과를 기대할 목적으로 "인터페이스"를 사용한다.
  • 클래스의 다중상속은 되지 않고, 인터페이스를 이용한다.
class 클래스명 {
	
	}
	
	interface 인터페이스명 {
	
	}
  • 인터페이스는 "완전추상" 의 개념이며, 인터페이스의 구성요소는 상수와 추상메소드 만으로 구성된다. (일반변수는 올 수 없음)
  • 인터페이스 안에 변수이름 앞에 final을 붙이지 않아도 자동 final이 된다.
  • 인터페이스 안 메소드 이름 앞에 abstract를 붙이지 않아도 자동 abstract이다.

🌞문자열 처리

  • 자바에서는 문자열 처리를 위하여 String, StringBuffer, StringBuilder의 클래스를 사용한다.

🌈String

  • String의 특성은 변하지 않는 문자열이다.

🌈StringBuffer, StringBuilder

  • StringBuffer와 StringBuilder는 변하는 문자열이다.(둘이 동작하는 방법은 동일)

🌞java.lang

  • 자바가 제공하는 클래스를 사용하기 위해서는 import를 해야한다.
  • 그러나 java.lang 패키지의 모든 클래스들은 자동으로 import 되기 때문에 사용자가 따로 import를 하지 않아도 된다.

🌞기본자료형 ==> String의 변환

String.valueOf();
기본자료형 + "";

🌞String ==> 기본자료형의 변환

  • Wrapper 클래스들을 이용한다.

  • 각 기본자료형에 따른 클래스들을 말한다.

    	<Wrapper 클래스>
    
    	- boolean		Boolean
    	- byte			Byte
    	- char			Character
    	- short			Short
    	- int 			Integer
    	- long 			Long
    	- float 		Float
    	- double 		Double

🌞예외처리

  • 프로그램 실행 중에 사용자의 부주의 등으로 인하여 예기치 않는 상황이 발생하는 것을 "예외"라고 하며, 이것을 처리하는 것을 "예외처리" 라고한다.
  • 자바에서는 대부분의 발생할 수 있는 예외에 대하여 이미 클래스로 만들어져 있다.
  • 그 상황이 되면 자동으로 예외객체가 생성된다.
	int []a = {10, 20, 30};
	a[4] = 5; //배열의 범위를 넘었을 때
    
	new ArrayIndexOutOfBoundException() ==> 자동으로 객체 생성
  • 예외가 발생할만한 코드를 그대로 두게 되면 사용자로부터 신뢰를 잃게된다.
  • 그렇기 때문에 예외처리가 필요하다.

🌈예외처리의 방법

try {
		예외가 발생할 만한 문장()
	} catch(예외자료형 변수명) { //여기서 캐치
		처리할 문장
	}

🌞예제

🌟(추상클래스와 추상메소드)예제1🌟

abstract class A { // A클래스는 추상클래스이고, 추상메소드를 가지고있다.

	public void test() {// 추상클래스는 추상메소드 뿐 아니라 body가 구체화된 메소드를 포함할 수 있다.
		System.out.println("test입니다.");
	}

	public abstract void pro(); // 추상메소드
}

class B extends A {

	@Override
	public void pro() {
		System.out.println("B의 pro입니다.");
	}

}

public class AbstractTest {

	public static void main(String[] args) {
		// A ob = new A(); //객체화 될 수 없다. 추상클래스의 객체는 생성할 수 없다.
//		B ob = new B();
//		ob.pro();
		
		A ob = new B();
		ob.pro(); //b의 구체화된 pro가 동작이 된다.
	}

}

🌟(interface)예제2🌟

interface A { // A라는 자료형을 만든다. (인터페이스 안에는 상수, 추상메소드만) === 완전추상
	public int a = 10; // final을 붙이지 않아도 자동 final

	public void pro(); // abstract을 붙이지 않아도 자동 abstract
}

interface B {
	public int b = 20;

	public void test();
}

class C implements A, B { // interface를 A, B 둘다 상속받는다. 인터페이스를 상속받을 떄에는 implements를 사용한다.

	@Override
	public void test() {
		System.out.println("test");

	}

	@Override
	public void pro() {
		System.out.println("pro");

	}

}

public class InterfaceTest {

	public static void main(String[] args) {
		C ob = new C();
		ob.pro();
		ob.test();
	}

}

🌟(StringBuffer)예제3🌟

public class StringBufferTest {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("hello");
//		sb = sb + " Java"; 오류
		sb.append(" java"); // 원래있던 객체에 java를 추가(append)
		System.out.println(sb);

		String str = "hello";
		str = str + " java";
		// String은 기본자료형처럼 사용가능하다.

	}

	// StringBuffer 에 append를 통하여 문자열을 추가하면 새로운 객체가 만들어지는 것이 아니라, 원래 객체에 문자열이 추가된다.

}

🌟(indexOf, IndexOf)예제4🌟

public class StringTest09 {

	public static void main(String[] args) {
		String data = "hello java";
		int n = data.indexOf('e'); //j가 몇번째에 나오는지 (글자가 중복이 될 경우 가장 앞에 있는 번째로 출력 , a는 7번째)
		int n2 = data.indexOf("java"); //java라는 글자가 몇번째에 나오는지 (indexOf)
		
		System.out.println(n);
		System.out.println(n2);
		
		System.out.println("--------------------------------");
		
		int n3 = data.lastIndexOf("a"); //a라는 글자를 끝에서부터 찾는다. 하지만, 인덱스를 따질 때는 왼쪽부터(lastIndexOf)
		System.out.println(n3);
		
		String data2 = data.replace("java", "oracle"); //data2는 java에서 oracle로 글자가 바뀌게 됨.
		System.out.println(data2);
		System.out.println(data);// 하지만 data의 값은 변하지 않는다.
	}

}
profile
꾸준히 성장하는 개발자✨

0개의 댓글