로그인
// 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의 메소드도 사용가능
'Programming > Java' 카테고리의 다른 글
[Java] 1/21 강의정리 (인터페이스, 예외처리, try catch,String Tokenizer,Generic) (0) | 2021.01.21 |
---|---|
[JAVA] 1/19 강의정리 (객체지향, 함수지향, 클래스, 메서드, 상속) (0) | 2021.01.19 |
[Java] 1/18 강의 정리 (JVM, JDK, 연산자, 배열, 객체지향) (0) | 2021.01.18 |
댓글