티스토리 뷰

프로그래밍

자바 기초 개념

ReturnToHome 2017. 8. 2. 16:11

자바 기초는 계속 까먹고, 계속 헷갈리네요. 아마 생각없이 개발을 하거나, 개념이 완벽하게 잡혀있지 않기에 그렇지 않나 싶습니다. (싶습니다가 아니라 그런 것 같습니다... 아니 그런 것 같습니다가 아니라 그래요.. ㅠ;;;) 그래서 항상 주기적으로 찾아보다가 사이트도 계속 까먹고 해서 간략하게 정리해서 메모해보겠습니다.


* 아래 내용은 https://wikidocs.net/book/31 에 있는 내용은 개인적으로 정리한 내용입니다.


-- private, ptorected, default, public

- private

- private 가 붙은 변수, 메소드는 해당 클래스 내에서만 접근 가능

- protected

- protected 가 붙은 변수, 메소드는 해당 패키지내의 클래스 또는 상속 받은 외부 패키지의 클래스에서 접근 가능

- default

- 아무것도 명시하지 않을 시 default

- 해당 패키지 내에서만 접근 가능

- public, public class

- public 이 붙은 변수, 메소드는 온동네 클래스에서 접근 가능

- public class 는 위와 조금 개념이 다르다.

TestClass.java 라는 파일이 있다고 가정.

소스 내용

class TestClass {}

class TestClassA {}

-> 컴파일 가능

class TestClass {}

public class TestClassA {}

-> 컴파일 오류

public class TestClass {}

class TestClassA {}

-> 컴파일 가능

--> 클래스 앞에 public 을 명시하게 되면 해당 클래스의 이름은 파일명과 동일해야 하기 때문이다.


-- static, static method

  - static 

  아래와 같은 클래스가 있다고 치자.

public class Test() {

String name = "test";

}

Test testA = new Test();

Test testB = new Test();

이렇게 두번 생성하게 되면 생성 할 때 마다 멤버변수 name 은 메모리에 별도로 할당되어 저장된다.

하지만 아래와 같이 static 을 명시하게 되면 메모리 할당은 한번만 하게 된다.

public class Test() {

static name = "test";

}

   - static method

static method 안에서는 static 이라고 붙은 변수에만 접근 가능. 일반 인스턴스 변수는 접근 불가능.

-- extends, interface, 다형성

- extends

public class Dog extends Animal {}

위는 Dog 클래스는 Animal 클래스를 상속받았다 라고 표현한다.

또한 Dog Is A Animal 이라고 표현하여 IS-A 관계라고 한다.

Dog 는 자식클래스, Animal 은 부모클래스가 된다.

Dog 클래스는 Animal 클래스를 상속하였기 때문에 Animal 클래스에 구현된 메소드 등을 그대로 사용 가능.

Animal dog = new Dog(); 는 가능. (개로 만든 객체는 동물 자료형이다.)

Dog dog = new Animal(); 은 불가능. (동물로 만든 객체는 개 자료형이다. 말이 안되지 않은가?)

번외로 모든 객체는 Object 클래스는 상속받는다. Animal 클래스도 public class Animal extends Object {} 와 같다는 말이다.


- interface

인터페이스는 여러개의 implements 가 가능.

public class Dog extends Animal implements A, B {};

- 다형성

public class Animal {}

public Interface A {}

public void methodA() {};

public Interface B {

public void methodB() {};

}

public class Dog extends Animal implements A, B {

public void methodA() {};

public void methodB() {};

}

public class Bouncer {

public void barkAnimal(B animal) {

animal.methodB();

}

}

위와 같이 있을 때 아래처럼 객체 생성이 가능.

Dog dog = new Dog();

Animal animal = new Dog();

InterfaceA ia = new Dog();

InterfaceB ib = new Dog();

이처럼 하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것이 다형성.


* 일반 클래스는 다중 상속 불가능 (public class Normal extends A, B {} --> A, B 는 일반 클래스. 불가능)

* 인터페이스는 다중 상속이 가능(public interface C extends A, B {} --> A, B 는 인터페이스. 가능)

-> 위 처럼 다중 상속하였을 경우 

public class Dog extends Animal implements C {

public void methodA() {};

public void methodB() {};

}

구현 하여 사용하면 됨.


-- abstract (추상클래스)

추상클래스는 구현체도 갖고 있으면서도 인터페이스 역할도 한다.

public class Animal {}

public interface A {

public void methodA() {};

}

public class Dog extends Animal implements interfaceA {

public void methodA() {};

}

라고 있을 시 위의 A 인터페이스를 추상클래스로 변경한다면 아래와 같이 사용한다.

public abstract class A extends Animal {

public abstract void methodA() {}

}

public class Dog extends A {

public void methodA() {}

}

이렇게 abstract 를 붙여 준다. 그리고 클래스와 더불어 메소드에도 abstract 붙여 주어 해당 abstract 클래스를 상속하는 클래스에서 구현하도록 한다. 여기서 이렇게 보면 사실 위의 상속들과 다를바가 없다. 그러나 아래와 같이 구현체를 직접 넣을 수도 있다.

public abstract class A extends Animal {

public abstract void methodA() {}

public void abstractMethod() {

System.out.println("Call abstractClassMethod");

}

}

이제 Dog 에서는 추상클래스 A 에 구현된 abstractMethod() 메소드를 직접 호출 할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함