Java : Basic1

Jamangstangs·2022년 1월 17일
0

Roadmap

목록 보기
1/8
post-thumbnail

Java 기초

Package

  • Package : 비슷한 성격의 자바 클래스들을 모아 놓은 디렉토리이다.
    • JDK 8 이전 : 꼭 필요하지는 않다.
    • JDK 11 이후 : 반드시 패키지를 요구한다.
    • Subpackage : package의 하의 패키지로, . 문자로 이어나갈 수 있다. (package.subpackage)

Literal

  • Literal : 소스코드에서 프로그래머가 직접 입력한 값을 의미한다.
  • 정수 리터럴 : 자바는 기본적으로 정수 리터럴을 int 타입으로 간주한다. -> 정수 리터럴이 int형을 초과할 경우, L을 붙여줘야한다. (21억 정도 초과하면 붙여주자.)
  • 문자 리터럴 : 하나의 문자를 ' '로 감싼 것이다.
  • 문자열 : " "로 감싼 문자들이다. (문자 리터럴을 표현하기 위해 ""으로 감싸면 유니코드로 변환이 안된다. )
  • 실수 리터럴 : 자바는 기본적으로 실수 리터럴을 double타입으로 간주한다. -> 실수 리터럴을 float에 저장하면 오류가 나므로, F를 붙여준다.

타입 변환

  • byte -> short -> int -> long -> float -> double : 작은 타입이 큰 타입으로 저장될 때 발생한다.
  • 문자열 + 숫자
    • String str = "123" + 1; -> String str = "1231";
  • 문자열 강제 타입 변환
    • 원하는타입 변수명 = 타입클래스.parse타입(str)
    • 문자열에서 한글, 특수문자, 알파벳이 있을 경우 예외처리 된다.
  • 기본 타입 강제 타입 변환
    • String str = String.valueOf(기본타입변수);

시스템 입출력

  • System.out.print()
  • System.in.read() -> 키보드로부터 입력된 문자 하나하나 읽는다. Enter까지 입력 받는다.
  • Scanner scanner = new Scanner(system.in) : System.in의 불편함을 보완하는 클래스이다.

break 라벨

Outter: for(int i=0; i<10; i++){
  for(int j=0; j<10; j++){
		if(j==1){
      break Outter;
    }
  }
}
  • 위와 같은 방식으로, break에 라벨을 붙여 원하는 지점의 반복문에서 반복문 종료가 가능하다.

Reference Type

  • Primitive Type : 실제 값을 변수 안에 저장한다.
    • boolean, byte, char, short, int, long, float, double
  • Reference Type : 메모리의 주소를 변수 안에 저장한다.
    • Array, Interface, Enum, Class

JVM 메모리 영역

Java Virtial Machine -> OS로부터 메모리 영역을 할당받는다. 무엇이 있는지 살펴보자.

  • Method Area : 모든 Thread가 공유하는 영역. class들을 클래스 로더로 읽고, 아래의 것들을 분류해서 저장한다.
    • Static Field, Constant, Method code, Constructor
  • Heap Area : Object, Array가 생성되는 영역, 객체의 실제 값이 저장되는 영역이다.
    • Object, Array를 참조하는 변수, 필드가 없으면 -> 의미없는 객체이다. -> Garbage Collector를 실행시켜 자동으로 실행한다.
    • 객체를 직접 제거 안해도 괜찮다.
  • Stack Area : 메소드 호출할때마다 Frame push, pop하는 동작을 수행한다.
    • Primitive Type Variable : 실제 변수의 값이 stack area에 저장된다.
    • Reference Type Variable : 배열, 객체가 저장된 heap area의 주소를 저장한다.

String Type

  • 문자열 리터럴이 동일하면, String 객체를 공유하도록 되어있다.
String str1 = "123";
String str2 = "123";
  • new 연산자를 사용하여 새로운 객체를 만들면 다른 객체를 참조하게 만들 수 있다.
String str1 = new String("123");
String str2 = new String("123");
  • String 객체의 주소 값이 아닌, 내부의 문자열이 같은지 비교하고 싶다.
System.out.println(str1.equals(str2));
  • String[] args의 의미
public static void main(String[] args) {}
// main 메소드 호출할 때 String 배열을 생성하고, main 메소드에 argument로 전달된다. 

Enumeration Type

  • 한정된 값만을 갖는 타입을 Enumeration Type이라고 한다.
//  Subject.java
// 열거 타입 선언.
public enum Subject {
  // 열거 상수 선언.
	MATH,
  MAGIC,
  SOCIAL,
  ENGLISH,
  KOREAN
}
  • 사용하는 방법은 다음과 같다.
// Enum type 변수 선언
Subject today;

// 열거 상수 지정하기.
Subject tomorrow = Subject.MATH;

OOP : Object Oriented Programming

Class

  • 파일 이름은 소스 파일 내부의 class이름과 같아야 한다.
  • 두 개 이상의 class를 선언 가능하지만, 파일 이름과 일치하는 public class가 존재해야 한다.
public class Person{}
class Alien{}
  • 컴파일 하면, byte code file(.class)가 Person.class, Alien.class 두 개가 생긴다.
  • 클래스의 용도
    • 라이브러리 클래스 : 다른 클래스에서 이용할 목적으로 제공된다.
    • 실행 클래스 : 실행 진입점임 main()을 제공하는 역할을 한다.
  • 구성 요소
    • Field : 객체의 데이터 저장되는 구역
    • Constructor : 객체 생성시 초기화하는 구역
    • Method : 객체의 동작을 구현한 구역

Method

  • 매개 변수의 개수를 모를 경우

    • 매개 변수를 배열 타입으로 선언한다.

    int plus(int[] nums) {}

  • Method Overloading : 하나의 메소드 이름에 과하게 적재한다는 의미를 가진다.

    • 즉, 하나의 메소드 이름으로 여러 기능을 구현하였기에 붙여진 이름이다.
    • 조건 : Parameter의 순서, 갯수 -> 이 중 하나가 달라야한다.
    int sum(int x, int y) {}
    double sum(double x, double y) {}
    
    sum(10.3, 10);
    // double sum이 호출이 된다. -> 2번째 인자인 10이 int->double로 자동 타입 변환이 가능하기 때문이다. 

Instance Member & Static Member

  • Instance Member : 인스턴스 생성 후 사용할 수 있는 필드와 메소드, 객체에 소속된 멤버이다.

    public class Person{
      // 인스턴스 필드
      int height;
      
      // 인스턴스 메소드
      void walk(){...}
    }
    • Instance Field : 객체마다 존재한다. (Instance 마다 따로 존재한다. )
    • Instance Method : Method 영역에 저장되고 공유된다. (Person1, Person2 객체 각각 height는 개별적으로 Instacne에 가지고 있지만, 메소드 같은 경우에는 메소드 영역에서 공유하고 있다는 소리이다.)
      • 왜? -> 객체마다 코드블록은 동일하기 때문에 각자 코드블록을 가지고 있을 필요가 없다.
  • Static Member : 클래스에 고정된 멤버 -> 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.

  • public class Nike{
    	// Static Field
      static String brandName = "Nike";
      
      // Static Method
      static String brandSell(){}
    }
    1. class이름으로 접근해야 하지만, 객체 참조 변수로도 접근이 가능하다. (되도록 클래스 이름으로 접근하자.)
    2. 클래스에 고정된 멤버 -> 클래스가 메모리로 로딩되면 className.staticMethod()로 접근이 가능하다. (객체 생성 안하고 사용 가능하다.)
  • Instance Field vs Static Field

    • Instance Field : 객체마다 가지고 있어야할 데이터
    • Static Field : 객체마다 가지고 있어야할 필요가 없고 공용으로 쓰이는 데이터
  • Instance Method vs Static Method

    • Instance Method : 인스턴스 필드를 포함할때 선언한다.
    • Static Method : 인스턴스 필드를 포함하고 있지 않을때 선언한다.

Singleton

  • 정의 : 전체 프로그램 내에서 단 하나의 객체만 만들도록 보장해야 하는 경우, 이 객체를 Singleton이라고 한다.

  • 만드는 방법

    1. class 외부에서 new연산자로 호출 불가능하게 만들어야한다. -> 생성자 앞에 private
    2. 정적 필드를 선언하고 자신의 객체를 생성한다. -> 코드로 보자
    3. 외부에서 호출 가능한 getInstance()를 선언해주고 자신의 객체를 리턴한다.
    public class Single{
      // 2. 정적 필드를 선언하고 자신의 객체를 생성한다. 
      private static Single singleton = new Single();
      
      // 1. 생성자 앞에 private을 붙인다. 
      private Single(){}
      
      // 3. getInstance 선언하고 자기 자신을 리턴한다. 
      static Single getInstance(){
        return singleton;
      }
    }

Final & Static Final

  • final : 초기값 저장되면 프로그램 실행 도중 수정이 불가능하다.

    1. field 선언시 값을 초기화 -> 필드 선언시에 주는 경우
    2. 생성자에게 값을 준다. -> 객체 외부 데이터로 설정해야 할 경우

    위의 두 가지 방법 말고는 final field를 수정할 수 없다.

  • static final : 각각의 의미를 분리해서 생각해보면 간단하다.

    1. static : 객체마다 존재 x -> 클래스에만 존재한다.
    2. final : 초기값 지정되면 변경이 불가능하다.

    객체마다 저장할 필요가 없다.

Package

  • 파일 시스템의 폴더 -> 클래스의 일부분이다. (클래스의 식별자 역할)
  • 패키지가 클래스의 일부분인 이유 : 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스를 사용할 수 없다.
    • upper/lower1 -> me.class
    • upper/lower2 -> me.class
    • 이렇게 있는데, upper/lower1에 있는 me.class를 upper/lower2로 옮겨서 사용할 수 없다.

Import

  • 사용하고자 하는 class 혹은 interface가 다른 package에 소속 -> import문으로 어디에 있는 패키지의 클래스와 인터페이스를 사용할건지 명시해준다.

  • 중요한 점 : 상위 패키지 import -> 하위 패키지 전부 import하는 건 아니다.

    import my.clothes.*;
    import my.clothes.pants.*;

Access Modifier

  • public : 외부 클래스가 자유롭게 사용 가능

  • protected : 같은 패키지의 모든 클래스, 자식 클래스, 다른 패키지의 자식 클래스만 사용 가능

  • default : 같은 패키지만 사용 가능 -> 따로 선어하지 않으면, 기본으로 default가 설정된다.

  • private : 외부에서 사용불가

  • 기본 생성자의 접근 제한 -> 따로 생성자를 선언하지 않으면 class의 접근 제한을 따라간다.

Getter & Setter

  • 객체의 필드를 외부에서 접근한느 것을 막기 위해 -> 메소드로 Field를 변경하는 방법을 제공한다.
    • Field : private으로 선언해서 외부로부터 보호한다.
    • Method
      • Getter : getMethodName(), isMethodName()
        • 리턴값이 boolean인 경우, is를 붙여주는 것이 관례이다.
      • Setter : setMethodName()

Inheritance

  • 상속 : 클래스를 재사용해서 새로운 클래스를 만든다 -> 중복되는 코드 줄여준다.
class ChildClass extends ParentClass{ }
  1. 하나의 부모 클래스만 상속이 가능하다.
  2. private member는 상속 안된다.
  3. 부모(PakageA), 자식(PackageB)라면, default member는 상속 안된다.
  • ParentClass와 ChildClass가 상속 관계에 있다고 하자.

    1. 부모 클래스의 객체가 먼저 생성
    2. 그 다음에 자식 클래스의 객체가 생성된다.

    자식 객체만 생성한다고 해도, 내부적으로는 부모 객체가 먼저 생성되고 자식 객체가 생성된다.

public class ChildClass{
  public ChildClass(){
    // 부모 클래스의 생성자
    super();
    // 부모 클래스의 생성자를 위와 같이 명시적으로 써놓지 않으면, 컴파일러가 자동으로 추가해준다. 
  }
}
  • 부모 클래스의 생성자에서 기본 생성자가 없고 매개변수가 있는 생성자가 존재하면, 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 명시해주어야 한다.

Method Overriding

  • 메소드 오버라이딩 : 부모 클래스에게 상속받은 메소드를 자식 클래스에서 다시 재정의하는 것을 의미한다. 조건은 아래와 같다.
    1. 부모 클래스의 메소드와 같은 형태를 가져야한다. (Method Name, Parameters, Return Type)
    2. Access Modifier를 더 제한할 수 없다.
    3. 새로운 예외를 throws할 수 없다.
  • @Override -> 어노테이션 써주면 재정의된 것을 알아채기 쉽다.

Final Class, Final Method

  • final : 초기화되면 더이상 수정할 수 없다는 키워드이다.

  • Final Class

    publid final class ClassName(){}
    • 상속할 수 없는 클래스가 된다.
  • Final Method

    public final void MethodName(){}
    • 최종적인 method이므로, 재정의가 불가능하다.
    • 즉, 자식 클래스에서 부모 클래스에 선언된 Final Method는 재정의할 수 없다는 소리이다.

Promotion

  • 자동 타입 변환 : 부모타입 변수에 자식타입 객체를 대입하면 자식타입 객체도 부모타입과 동일한 취급을 받는다.

    Child child = new Child();
    Parent parent = child;
    // parent, child는 동일한 객체를 가리킨다. 
    // Child 타입은 Parent 타입을 상속받는다. 
    • A <- B <- C : B가 A를 상속받고, C가 B를 상속받는다고 하자.
      • B의 객체는 A타입으로 Promotion 가능하다.
      • C의 객체는 B혹은 A 타입으로 promotion가능하다.
  • Promotion이후 주의 사항

    1. 자식 객체가 Promotion되면, 자식 클래스에만 선언된 메소드는 사용할 수 없다.
    2. 자식 객체가 Promotion되어도, 부모 클래스의 메소드를 Overriding한 메소드는 Overriding된 메소드가 사용된다.
  • 왜 필요할까? -> 다형성

Polymorphism

  • OOP에 있어서 하나의 Action을 여러 방식으로 할 수 있게 해준다.

    1. Method Overriding
    2. Method Overloading
    3. Promotion
  • Field Polymophism

    class Dormitory{
      Bed leftBed = new Bed();
      Bed rightBed = new Bed();
      
      void jump(){
        leftBed.spring();
        rightBed.spring();
      }
    }
    
    // 여기서, Bed를 각각 시몬스 침대와 장수돌침대로 교체할 것이다. 
    // Bed <- SimonsBed
    // Bed <- StoneBed
    
    Dormitory dormitory = new Dormitory();
    dormitory.leftBed = new SimonsBed();
    dormitory.rightBed = new StoneBed();
    
    // 기존의 Bed -> spring() 메소드가 있다고 하자. 
    // SimonsBed와 StoneBed는 spring 메소드를 overriding하였기에, spring메소드를 호출하면 자식 객체들의 메소드가 호출이 된다. 
    • 즉, Bed를 교체하면서 spring()메소드를 Dormitory에서 수정하지 않아도 다양한 spring()메소드의 Action을 구현할 수 있다.

Casting

  • Promotion : 자식 타입 -> 부모타입으로 변환
  • Casting : 자식타입에서 부모타입으로 변환된 객체를 다시 자식 타입으로 변환시킬대 사용 가능하다.
Parent parent = new Child();
boolean result = parent instanceof Child; // Child의 객체가 Parent의 자료형이어도, Child의 인스턴스이다. 
Child child = (Child)parent;

Abstract Class

  • Concrete Class : 실체를 생성할 수 있는 클래스
  • Abstract Class : Concrete Class들의 공통적인 필드와 메소드를 선언하여 만든 클래스를 의미한다.
  • Abstract Class를 사용하는 이유
    1. Concrete Class가 가져야할 멤버를 통일하는데 목적이 있다.
    2. 실체 클래스 작성할때 시간 절약 -> Child Class에서 추가적으로 구현할 필드와 메소드만 선언하면 된다.
public abstract class ClassName {
  // Field
  // Constructor
  // Method
}
  • 공통된 메소드 명이라고 해도, 실행하는 행동은 달라야하는 경우가 있다. -> Abstract Method
public abstract void methodName(){};
private abstract void methodName(){};
  • Abstract Method : 하위 클래스가 반드시 실행내용을 채우도록 하고 싶은 메소드가 있을 경우 추상 클래스에서 추상 메소드로 선언한다.

Inspired by https://github.com/woowacourse/back-end-roadmap

profile
자망스탕스

0개의 댓글