다형성
객체지향 프로그래밍의 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 |