Java(3)

Jinny·2021년 4월 12일
0

JAVA

목록 보기
3/8
post-thumbnail

클래스와 객체

  • 하나의 java 파일에 하나의 클래스를 두는 것이 원칙이나, 여러 개의 클래스가 같이 있는 경우 public 클래스는 단 하나이며, public 클래스와 자바 파일의 이름은 동일해야한다.

naming convention

  • 클래스 이름은 대문자로 시작(PascalCase)
  • package 이름은 다 소문자
  • 멤버변수, 메서드는 camelCase

메모리

Stack Memory: 함수가 호출될 때 사용하는 메모리로, 함수에서 사용하는 지역 변수, 파라미터 등 연산에 사용되는 임시 값이 생성되는 영역이다. 함수의 기능 수행이 끝나면 자동으로 반환되는 메모리이다.

클래스, 객체, 인스턴스

  • 클래스(Class)

    • 객체를 만들어 내기 위한 설계도 혹은 틀
  • 객체(Object)

    • 실세계에서 인식할 수 있는 모든 것들을 객체라고 할 수 있다.
    • ‘클래스의 인스턴스(instance)’ 라고도 부른다.
    • 객체는 모든 인스턴스를 포함하는 포괄적인 의미를 갖는다.
    • oop의 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부른다.
  • 인스턴스(Instance)

    • 클래스를 객체로 만들어서 메모리에 할당한 것.

    • 인스턴스는 객체에 포함된다고 볼 수 있다.

    • oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부른다.

      /* 클래스 */
      public class Animal {
          ...
      }
      /* 객체와 인스턴스 */
      public class Main {
          public static void main(String[] args) {
              Animal cat, dog; // 아직 메모리 할당은 안받았으니 그냥 '객체'
              
              // 인스턴스화
            cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
            dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
        }
      }
  • Q. 클래스 VS 객체

    • 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.
  • Q. 객체 VS 인스턴스

    • 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
    • 클래스를 바탕으로 메모리에 할당해 실제 사용할 때 인스턴스라 하고, 이 클래스의 인스턴스는 모두 객체라고 할 수 있다.
  • 추상화 기법

    1. 분류(Classification)
      • 객체 -> 클래스
      • 실재하는 객체들을 공통적인 속성을 공유하는 범부 또는 추상적인 개념으로 묶는 것
    2. 인스턴스화(Instantiation)
      • 클래스 -> 인스턴스
      • 분류의 반대 개념. 범주나 개념으로부터 실재하는 객체를 만드는 과정
      • 구체적으로 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것을 말한다.
      • ‘예시(Exemplification)’라고도 부른다.

자바의 자료형

  • 기본 타입(primitive type): 원래 언어에서 기본적으로 제공되는 자료형
    • char, int, float, double, boolean
  • 참조 타입(reference type)
    • class, interface 등
    • 참조 타입으로 선언된 변수가 참조 변수
    • 참조 값은 힙 메모리에 생성된 인스턴스의 메모리 주소 값
  • Wrapper class: 기본 자료타입을 객체로 다루기 위해서 사용하는 클래스들이다. 기본 타입의 값을 내부에 두고 포장한다. 래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경 불가능하고, 만약 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.
    • ex) int -> Integer, char -> Character

자바의 접근 제어자의 종류와 특징

  • default: 해당 패키지에 있는 클래스의 객체들만 접근 가능

this

  • 자기 자신의 생성된 인스턴스의 메모리를 가리킴(자신의 인스턴스의 힙메모리 주소를 카리킴)
  • 생성자에서 다른 생성자를 호출
public Person() {
	this("이름없음",1);		
    // default constructor가 호출되면 name = "이름없음", age = 1 으로 설정
}
public Person(String name, int age) {
	this.name = name;
    this.age = age;
}

// this를 이용해 다른 생성자를 호출할 때는 그 이전에 어떠한 statement도 사용할 수 없다
// 위와 같이 생성자가 여러 개이고 파라미터만 다른 경우 constructor overloading이라고 한다.

non-static 멤버와 static 멤버 의 차이

  • non-static 멤버

    • 공간적 특성: 객체마다 별도로 메모리 공간을 갖는다.
      • 인스턴스 멤버 라고 부른다.
    • 시간적 특성: 객체 생성 시에 멤버가 생성된다.
      • 객체가 생길 때 멤버도 생성된다.
      • 객체 생성 후 멤버 사용이 가능하다.
      • 객체가 사라지면 멤버도 사라진다.
    • 공유의 특성: 공유되지 않는다.
      • 멤버는 객체 내에 각각의 공간을 유지한다.
  • static 멤버

    여러 개의 인스턴스가 같은 메모리의 값을 공유하기 위해 사용

    • 공간적 특성: 멤버는 클래스당 하나가 생성된다.

      • 멤버는 힙메모리의 인스턴스 내부가 아닌 데이터 영역에 별도로 생성된다.
      • 클래스 멤버 라고 부른다.
    • 시간적 특성: 클래스 로딩 시(프로그램이 메모리에 로드될 때)에 멤버가 생성된다.

      • 객체가 생기기 전에 이미 생성된다.
      • 객체가 생기기 전에도 사용이 가능하다. (즉, 객체를 생성하지 않고도 사용할 수 있다.)
      • 객체가 사라져도 멤버는 사라지지 않는다.
      • 멤버는 프로그램이 종료될 때 사라진다.
    • 공유의 특성: 동일한 클래스의 모든 객체들에 의해 공유된다.

    • static 메소드에서는 인스턴스 변수를 쓸 수 없음

https://gmlwjd9405.github.io/2018/08/04/java-static.html

singleton 패턴

어떤 클래스에 대해 프로그램에서 단 하나의 인스턴스만 생성해야 할 때 사용하는 패턴이다.

// Company 인스턴스가 단 하나여야 하는 경우
public class Company {
    // 유일하게 생성되는 인스턴스
    private static Company instance = new Company();

    private Company() { }

    public static Company getInstance(){
        if(instance == null)
            instance = new Company();
        return instance;
    }
}
  • 생성자를 private으로 선언해서 외부에서 추가로 인스턴스 생성을 할 수 없도록 한다.
  • 프로그램에서 사용될 단 하나의 인스턴스를 클래스 내부에 static 변수로 생성한다.
  • public static 메서드로 getInstance() 를 만들고 이 메소드가 최초로 호출되는 시점에서 한번만 객체가 만들어지게 한다. 생성된 객체는 static 변수에 저장된다. 외부에서는 이 메서드를 통해 인스턴스에 접근하도록 한다.

배열

자바에서 배열은 new 생성자를 사용해 선언한다.

Book[] library = new Book[5];
int[][] arr = new int[2][3];

// length = 3 짜리 배열 초기화
int[] numbers = new int[] {0,1,2};		
int[] numbers = new int[3] {0,1,2};			//오류남
int[] numbers = {0,1,2};

배열 복사

System.arraycopy(library, 0, librarycopy, 0, 5)
  • 얕은 복사: 주소만 복사되는 것이어서 배열 요소가 변경되면 복사된 배열의 값도 변경 된다. 이 문제를 해결하기 위해서는 값 자체를 복사하는 깊은 복사를 사용해야 한다.

배열을 이용한 for문

for(String lang:strArray){
    System.out.println(lang);
}

ArrayList

기존 배열은 길이를 정하여 선언해야 하고, 중간에 요소를 삭제하거나 삽입하는 것도 어려워서 자바에서는 ArrayList 클래스를 제공한다. 여러 메서드와 속성을 사용해 객체 배열을 편리하게 관리 할 수 있다.

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.get(0);		// A 반환. list[0]은 안됨
profile
삐약 응애

0개의 댓글