[java] action , abstract, interface

2024. 8. 21. 00:14·JAVA

20240819수업

abstract class

함수 안의 코드가 없는 클래스 =>기능 無

(↔concrete class:함수 안에 코드가 있는 클래스(구상클래스,일반클래스))

abstract class Pet{
	String name;
	void eat() {
		System.out.println(name+"(이)가 사료를 먹습니다.");
	}
	abstract void sound();
}
  • abstract메소드가 있으므로 class앞에 abstract를 붙여야한다.(abstract 필드나 클래스가 존재할때도 마찬가지)
  • main의 eat과 sound만 접근가능

 

class Dog extends Pet{
	void keeping() {
		System.out.println(name+"(이)가 집을 지킨다");
	}
	@Override
	void sound() {
		System.out.println("멍멍");
	}
}

class Cat extends Pet{
	@Override
	void sound() {
		System.out.println("야옹");
	}
}
public class TestMain {

action

	public static void main(String[] args) {
		
		Dog dog1=new Dog();
		action(dog1,"츄");
		Dog dog2=new Dog();
		action(dog2,"바둑");
		Cat cat1=new Cat();
		action(cat1, "네로");
    }

만약 같은 역할을 수행하는 두개 이상의  요소가 있는경우, action 객체로 기능을 구현할 수 있다.

        private static void action(Pet pet, String name) {
		pet.name=name;
		pet.eat();
		pet.sound();
  • 부모 <- 자식 (O) :부모는 언제나 자식의 정보를 받을수있다. 단, 부모의 정보만 조작 가능하다(특별한 작업 없다면)
    부모 -> 자식 (X);
  • pet.keeping();은 안됨. ∵pet이 접근할 수 있는 함수범위만 조작가능(keeping메서드는 Dog클래스에만 있음)
  • 따라서 아래와 같이 if문을 생성한다.
if(pet instanceof Dog) {
  • 펫으로 만든 주소가 도그의 주소(100)라면
    =pet이 Dog class로 만들어진 instance라면
			Dog d=(Dog) pet;     //pet에 들어있는 주소를 Dog타입의 주소로 바꿔라
			d.keeping();         //Dog type 함수인 keeping()을 d로 호출한다
		}
}

Interface

모든 하위요소가 abstract일때 사용가능하다

class Duck {
	public void swim() {
		System.out.println("헤엄친다");
	}
}

interface IRacoon {
	//다형성:polymophism
	public void dig();
	
}

abstract class Racoon이라고 작성하는 대신 interface IRacoon이라고 작성할 수 있다.

class DuckRacoon extends Duck implements IRacoon{
	@Override
	public void dig() {
		System.out.println("땅을 판다");
		// TODO Auto-generated method stub
	}	
}

public class TestMain {
	public static void main(String[] args) {
		DuckRacoon dr= new DuckRacoon();
		dr.swim();
		dr.dig();
	}
}

DuckRacoon 클래스가 Duck클래스를 화장시키고 IRacoon을 구현한다.

implements를 오버라이딩 한다

main클래스에서 출력을 각각 가져온다.

 

심화예시

class Member {
//Field
	private int id;
	private String name;
	private String tel;

	// 기본 Constructor
	public Member() {}

	public Member(int id, String name, String tel) {
		// super(); //부모 class(object)의 생성자를 호출한다.
		this.id = id;
		this.name = name;
		this.tel = tel;
	}

	// toString()
	@Override // 데이터만 중요한 클래스
	public String toString() {
		return "Member [id=" + id + ", name=" + name + ", tel=" + tel + "]";
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, name, tel);
	}

	//member field data값을 비교
	@Override
	public boolean equals(Object obj) {//오브젝트-멩버타입도 스튜던트 타입도 다가능
		boolean result = false;
		Member m = (Member) obj;
		if(m.id>0) //번호를 검색 id가 0보다 클떄
			result=this.id==m.id;
		else if(m.name!=null&&!m.name.equals(""))//이름으로 찾기  이름이 빈문자열이 아니거나 null이 아닐떄
			result=this.name.equals(m.name);
		else
			result=this.tel.equals(m.tel); //id가 0보다 작거나 같거나 이름이 빈문자열이거나 null일떄
			return result;
	}
	
	/*
	 * @Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Member other = (Member) obj;
		return id == other.id && Objects.equals(name, other.name) && Objects.equals(tel, other.tel);
	}
	*/
	

}

public class TestMain {
	public static void main(String[] args) {
		Member m1 = new Member(1, "민지", "010");// 멤버객체가 인스턴스 된값만큼 넣음
		Member[] mArr = new Member[] { 
				new Member(1, "민지", "010"), 
				new Member(2, "카리나", "011"),
				new Member(3, "윈터", "012"), 
				new Member(4, "원영", "013"), 
				new Member(5, "유진", "014"),
				new Member(6, "다니엘", "015"), 
				new Member(7, "민니", "016"), 
				new Member(8, "쯔위", "017"),
				new Member(9, "사나", "018"), 
				new Member(10, "쯔위", "019") };
		// 찾으려는 회원정보-번호로 찾기
		Member m = new Member(3, null, null);
		findMember(mArr, m);

		// 이름으로 찾기
		Member m2 = new Member(0, "카리나", "null");
		findMember(mArr, m2);
		
		// 전화번허으로 찾기
				Member m3 = new Member(0, null, "017");
				findMember(mArr, m3);
	}

	private static void findMember(Member[] mArr, Member m) {
		Member mData =null;
		boolean isFound = false; //이즈파운드 스위치 변수 플래그 변수
		for (int i = 0; i < mArr.length; i++) {
			if (mArr[i].equals(m)) {
				mData=mArr[i];
				isFound=true;
				break; //for문 중지
			}
		}
		if (isFound != true) {
			System.out.println("못찾음");
		}else {
			System.out.println(mData);
		}
	}
}

'JAVA' 카테고리의 다른 글

[java]class에 모든 기능을 구현해서 출력  (0) 2024.08.22
[java]정렬하기(Sort), 람다식  (0) 2024.08.21
[java]객체 개념  (0) 2024.08.20
[java]getter/setter  (0) 2024.08.18
[java]Constructor, Override  (0) 2024.08.18
'JAVA' 카테고리의 다른 글
  • [java]class에 모든 기능을 구현해서 출력
  • [java]정렬하기(Sort), 람다식
  • [java]객체 개념
  • [java]getter/setter
라텐느
라텐느
이제 막 개발을 시작한 초보가 개인공부를 하는 공간입니다.
  • 라텐느
    괴발개발
    라텐느
    • 개발자 (153)
      • HTML|CSS (14)
      • JAVA (29)
      • JAVACSCRIPT (15)
      • SQL (16)
      • 기타 (5)
      • JSP (2)
      • SPRING (13)
      • SPRING BOOT (6)
      • Git&GitHub (1)
      • 시행착오 (2)
      • 개발일지 (35)
        • GreenMiniProject1 (12)
        • GreenMiniProject2 (9)
        • GreenFinalProject (14)
      • Flutter (5)
      • 자격증 (0)
        • SQLD (1)
      • AWS (2)
      • Linux (1)
      • 자료구조&알고리즘 (4)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 태그
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    HTML
    일지
    오블완
    AJAX
    티스토리챌린지
    tag
    JS
    태그
    부트캠프
    db
    개발자
    link
    SQL
    JQuery
    CSS
    javascript
    input
    자기계발
    java
    링크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
라텐느
[java] action , abstract, interface
상단으로

티스토리툴바