[Java] Java의 기초

윤경·2021년 7월 10일
0

Java

목록 보기
5/10

Java

  • 객체지향 프로그래밍 언어
  • 다중 스레드 지원
  • 포인터 제거 및 자동 메모리 관리, 동적 로딩 지원
  • 다양한 OS에서 동작할 수 있도록 JVM이 제공

객체 지향 언어: C++, Java
절차 지향 언어: C

Java와 같은 객체지향 언어에서도 코드는 순차적으로 실행

객체 지향과 절차 지향의 큰 차이는 Class
프로젝트, 패키지와 같은 큰 단위 객체는 for문으로 반복 생성이 불가능. 만약 100개의 프로젝트를 만들 경우 프로젝트를 만드는 코드를 100개 짜야 함.

그러나 객체 지향 언어를 사용하면 클래스를 사용해 외부 클래스에서 해당 클래스를 가져오는 것이 가능. 클래스가 객체를 의미한다고 생각하기.


인스턴스화

클래스 = 설계도

따라서 클래스를 만든다고 객체가 생성되는 것이 아님. 클래스를 사용해 실제 클래스 객체를 만들어야 함. 이를 Instance라고 함.

ex) Animal a = new Animal();


접근제한자

보통 메소드는 public, default
멤버변수는 private를 많이 사용
클래스의 접근 제한자는 public이나 default를 사용

접근 제한자의 보안 순
private - default - protected - public

private

: 해당 요소가 선언된 클래스에서만 사용 가능

default

: 접근 제한자를 따로 설정하지 않을 경우 기본값.
같은 패키지 내 클래스만 접근 가능

protected

: default와 유사하지만 protected가 선언된 요소는 같은 패키지 내 클래스와 해당 요소가 선언된 클래스를 상속받은 자식 클래스에서도 접근 가능.
(같은 패키지가 아닐 시에도)

public

: 모든 클래스 접근 가능


Encapsulation 캡슐화

외부 클래스에서 해당 요소에 직접적으로 접근하지 않고 요소가 생성된 클래스의 메소드를 사용해 간접적으로 사용 가능 ➡ Encapsulation
(멤버 변수는 보통 보안성을 위해 private로 선언.)

요소를 가져오는 메소드, 요소의 값을 설정하는 메소드를 getter 또는 setter.
get+가져올 요소
set+가져올 요소

getter 메소드로는 해당 변수값을 가져오고 (리턴값 O)
setter 메소드로는 해당 변수값을 재설정 (리턴값 X. void)


Constructor 생성자

: 클래스 객체가 인스턴스화 될 때 호출되는 메소드를 의미

  • return 값을 가지지 않음 void
  • 클래스 이름과 같은 이름을 가짐

Inheritance 상속

자바는 여러 클래스를 가짐. 이 클래스들의 최상위 클래스는 Object. 자바의 모든 클래스들은 Object 클래스를 상속 받음.

Object 클래스는 lang 패키지에 위치. 따라서 import시 import java.lang.Object를 통해 추가할 수 있음. 하지만 모든 클래스들은 Object 클래스를 상속받으므로 따로 명시할 필요가 없음.

상속 시에는 child extends parent 형식으로 extends 명령어를 사용해 상속 받음.

자식 클래스는 부모 클래스보다 더 많은 요소를 가짐.


Override

오버라이드: 부모 클래스를 상속받은 자식 클래스는 부모 클래스에 들어있던 메소드의 사용이 가능.
이 때 메소드를 자식 클래스에서 내용을 재정의해 사용 가능. 이를 오버라이드(덮어쓰기)라고 함.

Override vs Overloading

오버로딩은 생성자 및 메소드의 이름이 같고, 파라미터의 타입이나 개수만 다르게 하여 여러개를 생성하는 것.


Polymorphism 다형성

상속의 개념을 생각해보면, 부모 클래스는 하나만 존재. 반면 자식 클래스는 여러 개 존재 가능.

예를 들어 자식 클래스가 여러 개 존재할 경우 이의 자식 객체들을 한 배열에 넣는 것이 불가능. 하지만 자식 클래스를 포괄하는 개념의 부모 클래스로 배열 타입을 정의할 경우 자식 객체를 배열에 넣을 수 있음.
이를 다형성으로 정의.
다형성 개념을 통해 코드 절감.


UpCasting

Animal[] animals = new Animal[3];
animals[0] = new Cat();
animals[1] = new Dog();
animals[2] = new Fox();

Cat, Dog, Fox 객체들이 모두 Animal 클래스를 상속받을 경우, Animal 배열에는 이 세 가지 객체들을 모두 넣을 수 있음.

즉, Animal이라는 타입은 Cat, Dog, Fox 세 가지 객체를 포괄 가능한 상위 타입.

그리고 이 자식 객체들은 상위 타입 배열에 들어가게 되며 자동으로 상위 타입인 Animal 객체로 형변환하게 됨. 이를 UpCating이라고 함. 업캐스팅 시에는 형변환 표시의 생략이 가능.

DownCasting

다운 캐스팅의 경우 캐스팅 형식 생략 불가.
(Cat)animals[0]와 같이 표기해줘야 Cat이 가진 함수 사용 가능.


Abstract Class 추상 클래스

추상 클래스: 추상 메소드가 하나 이상 존재하는 클래스.
추상 메소드는 내용이 구현되지 않고, 선언만 된 메소드를 의미.
따라서 추상 클래스는 추상 클래스에 추상 메소드를 선언만 해놓고, 해당 클래스를 상속받은 자식 클래스들이 추상 메소드를 오버라이딩하여 구현하게 하는 방식으로 사용.

추상 클래스는 인스턴스화(객체화)가 불가능.
상속을 염두에 두고 만들어짐.

추상 클래스를 상속받은 자식 클래스들은 추상 메소드를 반드시 재구현. (일반 메소드는 재구현하지 않아도 됨.)

추상 클래스에는 일반 메소드와 추상 메소드 모두 정의 가능.

  • 일반 메소드: 선언 후 내용이 구현된 메소드. 상속받을 경우 오버라이딩 하지 않아도 됨.
  • 추상 메소드: 내용이 구현되지 않고 선언된 메소드. 상속받을 경우 반드시 오버라이딩이 필요.

Interface

: 추상 클래스와 동일하게 인스턴스화가 불가능. 다른 클래스들을 위한 라이브러리 개념이라고 생각.

추상 클래스와 다르게 인터페이스 추가 시 명령어로 extends가 아닌 implements를 사용.
추상 메소드만 정의 가능(일반 메소드 정의 불가)

인터페이스는 클래스에게 다중 상속 가능 (메소드들이 선언만 되어 있으므로 다이아몬드 상속 문제가 일어나지 않음.)


참고링크
https://velog.io/@soir/Java-%EA%B8%B0%EC%B4%88-Inheritence-Polymorphism-Overriding-Casting
https://velog.io/@soir/Java-%EA%B8%B0%EC%B4%88-Abstract-Class-Interface-Wrapper-Class

profile
개발 바보 이사 중

0개의 댓글