본문 바로가기
Programming/Java

[Java] 1/20 강의 정리 (로그인 구현, 상속, 오버라이드, 패키지, 추상클래스, 인터페이스)

by jionee 2021. 1. 20.
SMALL

로그인

// LoginSystem.java

package ch06.login;

public class LoginSystem {
	public LoginResult doLogin(String id, String pass) {
		LoginResult result = new LoginResult();
		if(id.equals("admin")&&pass.equals("1234")){
			result.result = true;
			result.message = id + "님 반갑습니다.";
		} 
		else if(!id.equals("admin")) {
			result.message = "아이디를 확인하세요.";
		}
		else {
			result.message = "비밀번호 확인하세요.";
		}
		return result;
		}
}

 

//LoginResult.java

package ch06.login;

public class LoginResult {
	boolean result;
	String message;
	
	public void printResult() {
		System.out.println(this.result + ":"+this.message);
	}
	
	public void printResult(String msg) {
		System.out.println(this.result + ":"+this.message + "("+ msg +")");
	}
}

 

//LoginTest.java

package ch06.login;

public class LoginTest {

	public static void main(String[] args) {
		LoginSystem login = new LoginSystem();
		LoginResult result = login.doLogin("hong","1234");
		result.printResult(); 	//false : 아이디를 확인하세요.
		
		result = login.doLogin("admin","12345");
		result.printResult();	// false : 비밀번호를 확인하세요.
		
		result = login.doLogin("admin","1234");
		result.printResult();   // true : admin님 반갑니다.
		result.printResult("고객센터");
		
		// LoginResult2 result2 = (LoginResult2)login.doLogin("hong","1234");
		// result2.printResult();
		
		LoginResult2 result2 = new LoginResult2();
		result2.message = "aaa";
		result2.result = true;
		result2.printResult();
	}

}

 

 

상속 - 메서드 오버라이딩

- 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것

- 다음과 같은 조건을 충족할 경우 가능

  • 메서드 명은 클래스의 메서드 명과 같아야 한다.
  • 메소드의 선언부는 부모 클래스의 메서드와 같아야한다.
  • 반환 타입은 부모 클래스의 반환 타입과 같아야한다.
  • 접근 제한자는 부모 클래스의 메서드와 같거나 더 넓은 범위로 지정해야한다.
  • 예외 범위는 부모 클래스의 메서드 보다 작아야한다.
@Override
접근제한자 	반환타입   메소드명   (자료형... 매개변수명) {
	실행구문
    return 반환값;
}

 

 

 

LoginResult 오버라이드

//LoginResult2.java

package ch06.login;

public class LoginResult2 extends LoginResult {
	@Override
	public void printResult() {
		System.out.println(this.result + "-"+this.message);
	}
	
	public void saveResult() {
		System.out.println(this.result + "-"+this.message
				+ ": saved");
	}
	
} 
package ch06.login;

// LoginTest.java

public class LoginTest {

	public static void main(String[] args) {

		LoginResult2 result2 = new LoginResult2();
		result2.message = "aaa";
		result2.result = true;
		result2.printResult("지원");
		result2.saveResult();
	}

}

PrintResult 부모 클래스(LoginResult)에서 오버라이딩

saveResult 는 자식 클래스(LoginResult2)에서 새로 정의

 

 

SpiderMan 상속

//Person.java

package ch07.extend;

public class Person {
	String name = "";
	
	public void eat() {
		String name = "";
		name = "홍길동";
		System.out.println("먹는다.");
	}
	
	public void jump() {
		System.out.println("뛰기.");
	}
	
}
//SpiderMan.java

package ch07.extend;

public class SpiderMan extends Person {
	boolean isSpider;
	
	public void fireWeb() {
		System.out.print("거미줄 발사");
	}
}

Person을 상속받아 SpiderMan 생성 (상속)

is a 관계

 

 

 

 

Spide 포함

//Spider.java

package ch07.extend;

public class Spider {
	public void jump() {
		System.out.println("키*100만큼 엄청난 점프");
	}
	
	public void fireWeb() {
		System.out.println("거미줄 발사");
	}
	
}
// SpiderMan2.java

package ch07.extend;

public class SpiderMan2 extends Person {	//is a (상속관계)
	Spider spider = new Spider();	// has a (포함관계)
	boolean isSpider;
	
	public void fireWeb() {
		if(this.isSpider) {
			spider.fireWeb();
		}
		else {
			System.out.println("거미줄을 발사할 수 없습니다.");
		}
		
	}
	
	public void jump() {
		spider.jump();
	}
}

Spider 클래스를 포함하는 SpiderMan2 (포함)

has a 관계

SpiderMan2는 Person을 상속함 (상속0

is a 관계

 

 

 

Super

- super를 통해 조상의 멤버에 접근 가능

- this가 현재 객체를 참조한다면 super는 조상 객체를 참조

 

 

패키지

- 자바에서 클래스를 관리하기 위해 사용하는 방법

- 폴더 구조와 동일

- 다른 패키지의 클래스를 사용하기 위해서는 import문을 이용해야함

- 접근 제한자

  • 클래스내의 멤버변수나 메서드의 사용범위를 지정
  • 은닉성을 확보하기 위해 사용
  • 클래스, 생성자, 멤버 변수, 멤버 메서드에 적용

public +

protected *

private -

 

 

싱글턴 디자인

- 객체를 한개만 만들고 재활용

- 가장 큰 특징은 정적(static)을 이용해 객체가 계속 생성되지 않게함

- 대상 객체를 외부에서 직접 생성할 수 없어야함

- private 접근 제어자를 사용해 외부에의 노출을 차단함

package ch07.modifier;

class SingletonClass{
	private static SingletonClass instance = new SingletonClass();	// 객체 없이 메서드를 사용하기 위해 메서드와 멤버변수에 static 선언
	private SingletonClass() {	// 내부서 자신의 객체를 생성하고 내부 변수에 저장
		
	}
	
	public static SingletonClass getInstance() {	// 멤버 변수에 접근할 수 있는 getter
		return instance;
	}
	

	public void sayHello() {
	System.out.println("Hello");
	}
}

public class SingletonTest {
	public static void main(String[] args) {
		SingletonClass sc1 = SingletonClass.getInstance();
		SingletonClass sc2 = SingletonClass.getInstance();
		System.out.printf("두 객체는 같은가? %b%n", sc1==sc2);
		sc1.sayHello();

	}
}

*** SingletonClass의 객체가 필요할 때는 객체를 생성하는 것이 아니라 getInstance() 메서드를 호출하면 됨

이 메스드의 리턴은 언제나 하나의 객체

 

 

추상클래스

- 일반 클래스와 다르게 본체가 없는 메서드 선언이 가능

- 자식 클래스에서 오버라이딩 한 뒤에 메서드 본체를 구현하게 하는 클래스

- 자손 클래스들에서 어차피 재정의해서 사용되기 때문에 조상 입장에서는 구현할 필요가 없거나 조상레벤에서 아직 작성할 수 없는 메서드에 대해 선언부만 작성하고 구현부를 세미콜론으로 대체한 후 구현부가 없다는 의미로 abstract 키워드를 선언부에 추가

abstract class 추상클래스명 {
	public void 일반메소드명(){
    	실행구문
    }
    
    public abstract 반환타입 추상메소드명();
}
        
class 자식 클래스명 extends 추상클래스명 {

@Override 
public 반환타입 추상메소드명(){
	실행구문
    }
}

 

 

추상클래스 예시

package ch08.abs.middle;

abstract class Vehicle{
	private int curX, curY;
	
	public void reportPosition() {
		System.out.printf("현재 위치: (%d,%d)%n", curX,curY);
	}
	
	public void addFuel() ;
}

class DieselSUV extends Vehicle{
	@Override
	public void addFuel() {
		System.out.println("주유소에서 급유");
	}
			
}

class ElectricCar extends Vehicle {
	@Override
	public void addFuel() {
		System.out.println("급속 충전");
	}
}

public class VehicleTest {
	public static void main(String[] args) {
		Vehicle[] vehicles = {new DieselSUV(), new ElectricCar()};
		for (Vehicle v : vehicles) {
			v.addFuel();
			v.reportPosition();
		}

	}

}

 

 

 

인터페이스

- 멤버 변수 및 본체가 없는 메서드의 정의만 가능

- 멤버 변수는 public static final로 선언 되어야 하며 생략 가능

- 메서드는 public abstract로 선언되어야 하며 생략 가능

- 직접 객체를 생성할 수 없어 인터페이스를 상속 받은 클래스를 생성한 뒤에 클래스 객체를 생성한다.

- 인터페이스는 다중 상속이 가능

- 인터페이스 자체로는 객체가 될 수 없기 때문에 생성자나 초기화 블록도 존재하지않음

- 멤버 변수와 메서드로만 구성

- 인터페이스에 선언된 모든 메서드는 public abstract여야 함.

interface 인터페이스명 {
	반환타입 메소드명();
}
class 클래스명 implements 인터페이스명... {

	@Override 
    반환타입 메소드명() {
    	실행구문
    }
}

 

 

인터페이스 클래스 예제

 

//InterfaceBace.java

package ch08;

public interface InterfaceBace {
	public void printMessage();

}
//SuperClass.java

package ch08;

public class SuperClass implements InterfaceBace {
	
	public SuperClass() {
		System.out.println("SuperClass..");
	}
	
	@Override
	public void printMessage() {
		System.out.println("SuperClass Method.");

	}

}
//ChildClass.java

package ch08;

public class ChildClass extends SuperClass {
	
	public ChildClass () {
		System.out.println("ChildClass...");
	}

	public static void main(String[] args) {
		ChildClass child = new ChildClass();
		child.printMessage();
		System.out.println();
	}

}

 

인터페이스 - 슈퍼클래스 - 자식클래스 순으로 상속받음

 

자식 클래스를 실행하면 슈퍼클래스가 자동으로 호출되어

SuperClass..가 나오고, 그다음 Childclass...가 나옴

ChildClass가 SuperClass를 상속받고 SuperClass가 Interface를 상속받았기 때문에 Interface의 메소드도 사용가능

댓글