JAVA

[JAVA]객체#3

로돌씨 2024. 2. 21. 19:23
다형성
객체지향 프로그래밍의 3대 특징 중 하나로 ‘여러 개의 형태를 갖는다’는 의미 하나의 행동으로 여러 가지 일을 수행하는 개념 상속을 이용한 기술로 부모 타입으로부터 파생된 여러 가지 타입의 자식 객체를 부모 클래스 타입 하나로 다룰 수 있는 기술

 

추상클래스(abstract)

  • 몸체 없는 메소드를 포함한 클래스 추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
  • 선언 -> [접근제한자] abstract class 클래스명 {}

부모클래스

public abstract class Animal {
	//추상 클래스로 만들기
	//public void bark(); 몸체가 필요하다는에러가 뜸
	//추상클래스 -> 상속받는 자식클래스가 반드시 구현되어야 함 
	public abstract void bark();
	
	public void eat(String animal) {
		System.out.println(animal + " 먹는다. ");
	
	}
}

 

자식클래스

public class Dog extends Animal{
	@Override
	public void bark() {
		System.out.println("멍멍");
		
	}

}
package com.poly.test01;

public class Cat extends Animal {
	@Override
	public void bark() {
		System.out.println("야옹");
	}

	@Override
	public void eat(String animal) {
		super.eat(animal);
	}

}
public class Mtest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Cat cat = new Cat();
		Dog dog = new Dog();
		
		cat.bark();
		dog.bark();
		cat.eat("참치");
		dog.eat("뼈다귀");
	}

}출력값:
야옹
멍멍
참치 먹는다. 
뼈다귀 먹는다.

 

다른 예제 )

베이스 클래스 생성

public abstract class Base {
	public Base() {
		System.out.println("base 생성");
	}
	
	public abstract void start();
	public abstract void stop();
	
}

 

베이스클래스 상속받아 클래스 만듦

public class Cow extends Base {

	@Override
	public void start() {
		System.out.println("송아지 걷는다.");
		
	}

	@Override
	public void stop() {
		System.out.println("송아지 멈췄다.");
		
	}

}

 

public class Dog extends Base{

	@Override
	public void start() {
		System.out.println("강아지 걷는다.");
		
	}

	@Override
	public void stop() {
		System.out.println("강아지 멈췄다.");
	}
	
}
public class Cat extends Base {

	@Override
	public void start() {
		System.out.println("고양이 걷는다.");
		
	}

	@Override
	public void stop() {
		System.out.println("고양이 멈췄다.");
	}
	
	

}

 

사용하기

import java.util.Scanner;

public class Mtest {
	public static void main(String[] args) {
		System.out.println("선택 [ 1: 고양이 2: 강아지 3:송아지] : ");
		Scanner sc = new Scanner(System.in);
		int select = sc.nextInt();
		
		//Base base = new Base(); -> 에러 , 베이스는 추상클래스이기 떄문
		Base base = null;

		switch (select) {
		case 1:
			base = new Cat();
			break;
		case 2:
			base = new Dog();
			break;
		case 3:
			base = new Cow();
			break;

		}
		base.start();
		base.stop();
	}
}출력값:
선택 [ 1: 고양이 2: 강아지 3:송아지] : 
1
base 생성
고양이 걷는다.
고양이 멈췄다.

 

 

추상클래스 (interface)

  • 상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체 메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로 상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함
  • [접근제한자] interface 인터페이스명 { //상수도 멤버로 포함할 수 있음}

INTERFACE

public static final 자료형 변수명 = 초기값;

  • 추상 메소드만 선언 가능
  • [public abstract] 반환자료형 메소드명([자료형 매개변수]);
  • public abstract가 생략되기 때문에 오버라이딩 시 반드시 public 표기해야 함

베이스 클래스

public interface Animal {//interface에 들어가는 접근제한자는 모두 퍼블릭이다. 
	public abstract void bark();
	void eat(String animal); // 이런모양으로 생략가능
	

}

 

implments로 상속

public class Cat implements Animal{//interface는 임플리먼츠로 상속받음 

	@Override
	public void bark() {
		System.out.println("야옹");
	
	}

	@Override
	public void eat(String animal) {
		System.out.println( animal + "먹는다.");
		
	}
	
	

}
public class Dog implements Animal {

	@Override
	public void bark() {
		System.out.println("멍멍");
		
	}

	@Override
	public void eat(String animal) {
		System.out.println(animal +"먹는다.");
		
	}

}

 

출력

public class Mtest {
public static void main (String [] args) {
	Animal ani = new Cat ();
	ani.bark();
	ani.eat("참치");
	
	ani = new Dog();
	ani.bark();
	ani.eat("뼈다귀");
}
}
출력값:
야옹
참치먹는다.
멍멍
뼈다귀먹는다.

 

베이스

public abstract class Animal {//abstract 에 체크하면 이렇게 추상클래스가 만들어짐
	public abstract void bark();
	public void eat(String animal) {
		System.out.println(animal + " 먹는다. ");
	}
}

 

상속

public class Cat extends Animal{

	@Override
	public void bark() {
		System.out.println("야옹");
		
	}
	public void eat(String feed) {
		System.out.println(feed + "먹는다~!");
	}

}
public class Dog extends Animal{

	@Override
	public void bark() {
		System.out.println("멍멍");
		
	}
	public void bite() {
		System.out.println("깨물다.");
	}

}
public interface Bird {
	public void fly();

}
public class Eagle extends Animal implements Bird {

	@Override
	public void fly() {
		System.out.println("파닥파닥");
		
	}
	public void bark() {
		System.out.println("삐약삐약");
	}
}-> interface와 abstract를 같이 받은 모습

출력

public class Mtest {

	public static void main(String[] args) {
		Animal ani = new Cat();
		ani.bark();
		ani.eat("참치");
		
		ani = new Dog();
		ani.bark();
		ani.eat("개껌");
		//ani.bite(); -> dog 클래스에만 있는 내용이라 메인에서 실행이 안됨
		((Dog)ani).bite(); // 강제로 형변환 해줘서 돌아가게 함
		
		ani = new Eagle();
		ani.bark();
		ani.eat("토끼");
		((Eagle)ani).fly(); //똑같은 원리
	}

}출력값:
야옹
참치먹는다~!
멍멍
개껌 먹는다. 
깨물다.
삐약삐약
토끼 먹는다. 
파닥파닥

 

API란?

application Progamming interface 의 준말 , 

여러프로그램들과 데이터베이스 , 그리고 기능들의 상호통신방법을 규정하고 도와주는 매개체 

 

String

public class Run {
	public static void main(String[] args) {
		method1();
		method2();
	}

	public static void method1() {
		// string buffer는 수정이 가능 .
		// 1.문자열을 리터럴로 생성
		String str = "abc";
		String str1 = "abc";
		// 2.생성자를 통한 문자열 생성
		System.out.println(str);
		System.out.println(str1);
		System.out.println(str.hashCode());
		System.out.println(str1.hashCode()); // 출력결과는 해시코드 동일

		String str2 = new String("abc");
		String str3 = new String("abc");

		System.out.println(str2.hashCode());
		System.out.println(str3.hashCode()); // 결과는 똑같이 동일
		// -------------------
		System.out.println(System.identityHashCode(str));
		System.out.println(System.identityHashCode(str1));// 결과는 동일
		System.out.println("new 사용");

		System.out.println(System.identityHashCode(str2));
		System.out.println(System.identityHashCode(str3)); // new 사용한 결과는 서로 다르게 나옴

	}

	public static void method2() {
		String str = "abc";
		// concat() -> 합치기
		System.out.println(str.concat("def")); // = abcdef
		// contains() 포함여부 확인
		System.out.println(str.contains("a")); // = "a"가있는지? -> true
		System.out.println(str.contains("ac")); // = false
		// split() -> 자르기
		String str1 = "a,b,c,d";
		str1.split(","); // ','를 기준으로 자르겠다.

		String[] sArr = str1.split(",");
		for (String ar : sArr) {
			System.out.println(ar);
		}
		//toUpperCase() ->대문자로 바꾸는것
		System.out.println(str.toUpperCase());
		
		String str2 = "    abc    ";
		//trim() 앞 , 뒤 공백 제거하기
		System.out.println(str2);
		System.out.println(str2.trim());
	}
}출력값:
abc
abc
96354
96354
96354
96354
1039949752
1039949752
new 사용
1182461167
1297149880
abcdef
true
false
a
b
c
d
ABC
    abc    
abc

 

StringBuffer 와 StringBulider

public class Run {
	public static void main(String[] args) {
		method1();
		method2();
		method3();
	}

	public static void method1() {
		StringBuilder sb = new StringBuilder("안녕 반가왕");
		System.out.println(sb);
		System.out.println(sb.capacity());//기본 값16에 6인 문자를 더해줘서 22 출력
		System.out.println(sb.length()); // 6
		
	}
	public static void method2() {
		String str = "반가워 ! " ;
		System.out.println(System.identityHashCode(str));
		str += "난 String이라고해!";
		System.out.println(System.identityHashCode(str)); // 값이 변함 ->불변이라 새로 방을 생성해서 바꿈
		
		StringBuffer sbf = new StringBuffer("안녕! ");
		System.out.println(System.identityHashCode(sbf));
		sbf.append("난 StringBuffer야 ");
		System.out.println(System.identityHashCode(sbf)); // 값이 같음 -> 가변이라 새로 방을 만들 필요없음
	}
	
	public static void method3() {
		StringBuilder sb = new StringBuilder("난 ");
		//append -> 추가하기 
		sb.append("잠이 온다 . ").append("~~!"); // 출력값 난 잠이 온다.  ~~!
		//insert -> 추가하기 (index , 추가할 말)
		sb.insert(0, "늦게 잠을자느라 " ); // 늦게 잠을 자느라 난 잠이온다. ~~!
		//delete-> 삭제하기 (index 0 부터 10 이전까지 )
		sb.delete(0,10); // 잠이 온다 . ~~! 
		System.out.println(sb);
		//reverse -> 뒤집기 
		sb.reverse(); // !~~ . 다온 이잠 
		System.out.println(sb); 
	}
	
	
	
}출력값:
안녕 반가왕
22
6
1039949752
1182461167
2116908859
2116908859
 잠이 온다 . ~~!
!~~ . 다온 이잠

 

StringTokenizer

import java.util.StringTokenizer;

public class Run {
public static void main(String [] args) {
	//countToken : 토큰 수 파악 , nextToken :토큰 읽어오기 ,hasMoreTokens : 토큰이 남아있는 경우 boolean값으로 리턴
	String str = " 박영석 , 25 , 서울시 관악구 , 남 ";
	StringTokenizer st = new StringTokenizer(str, ","); // 자를기준 , ','를 기준으로 자르자 
	System.out.println(st.countTokens()); // 출력값 4
	while(st.hasMoreTokens()) { // 트루이기때문에 토큰의 값을 가져옴
		System.out.println(st.nextToken());
	}
	
	
}
}출력값:
4
 박영석 
 25 
 서울시 관악구 
 남

 

'JAVA' 카테고리의 다른 글

[JAVA]입출력( I / O )  (0) 2024.02.22
[JAVA]예외처리  (0) 2024.02.22
[JAVA]객체#2  (0) 2024.02.20
[JAVA]객체지향 프로그래밍  (0) 2024.02.19
[JAVA]배열  (0) 2024.02.14