객체와 배열

주8·2023년 1월 5일
0

객체(Object)


객체의 구성요소

  • 속성(Attributes): 객체의 특징, 데이터 (ID, 날짜, 금액, 크기, 상태 등)
    • 클래스에서 변수로 정의
  • 기능(Operations): 객체의 기능, 동작(값 셋팅, 값 보여주기, 계산 등)
    • 클래스에서 메소드로 정의
  • ID: 객체 ID는 JVM에서 내부적으로 각 객체의 고유 식별자
  • 속성과 기능을 객체의 멤버(구성요소)라고 한다.
    • 멤버 변수, 멤버 메소드
  • 속성은 특정 데이터 또는 다른 Object가 될 수도 있다(고객 객체의 속성으로 주문 객체가 있을 수 있다).
  • UML: 객체지향분석과 설계를 위한 모델링 언어로 시스템 개발과정의 원활한 의사소통을 위한 표준화 언어

클래스, 객체, 인스턴스

  • 클래스(Class): 붕어빵 틀(Template) = 하나의 붕어빵 틀로 수많은 붕어빵 객체를 만들 수 있다.
  • 객체(Object): 붕어빵(들), 객체는 인스턴스를 포함하는 일반적인 의미
  • 인스턴스(Instance): 각각의 붕어빵(인스턴스는 클래스를 통해 생성된 객체의 한 예이다)
  • 인스턴스화(Instantiate): 붕어빵을 굽다(클래스로부터 인스턴스를 생성하는 것)

객체 생성과 객체 참조 변수 (Object reference variables)

Order order = new Order();
//객체 참조 변수 선언과 객체 생성

객체 참조 변수 Memory

참조(Reference) 변수는 stack 영역에 참조할 수 있는 값(주소)만을 저장하며, 실제 할당된 데이터들은 Heap 영역 객체내의 멤버 변수들에 저장된다.

객체는 아래와 같은 순서로 초기화되고 메모리에 할당된다.
1. 선언된 상태에서는 메모리의 reference를 위한 공간만을 할당함
2. new 연산자를 사용해야만 MyDate를 위한 공간이 할당됨
3. 멤버들의 명시적인 초기화
4. 생성자를 실행
5. 변수에 Reference값 할당

public class MyDate{
	private int day = 1;
	private int month = 10;
	private int year = 2000;
	public MyDate(int day, int month, int year){
		this.day = day;
		this.month = month;
		this.year = year;
	}
}

기존에 생성된 Reference 변수에 다른 Reference 변수를 할당하면 기존의 Reference를 끊고 새로운 인스턴스를 Reference한다.

int counter = 10;

Student std = new Student();
Student otherStd = new Student();
std = otherStd; //otherStd의 동일한 인스턴스를 Reference 한다.

문자열을 저장하는 Reference type의 class로 Java API(java.lang.*)내에 포함되어 있다.
String class는 new 키워드를 사용하는 방법과 new 키워드 없이 생성하는 두 가지 방법을 제공한다.
String 문자열은 객체는 Heap Memory내에서도 문자열 리터럴 값을 String Pool에 저장해놓고 동일한 문자열을 생성하면 동일한 리터럴 값의 주소를 할당해준다.
new로 생성한 경우엔 일반 객체처럼 Heap 영역에 값으로 생성된다.

  • 선언
ClassName identifier;
String myName;
  • 문자열 생성 및 값 할당
identifier = new ClassName("문자열");
myName = new String("홍길동");

String myName = new String("홍길동");
String myName = "홍길동"; //new 키워드 없이 생성

배열(Array)

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것으로 reference type 변수를 지원한다.

  • 자바 프로그래밍 언어에서 배열(Array)은 동적으로 생성되는 객체이며, Object 타입의 변수로 할당된다.
  • 배열은 Object 클래스의 모든 메소드를 호출할 수 있다.
  • 배열의 컴포넌트는 0에서 n-1까지의 정수 인덱스를 사용하여 reference한다.
  • 배열 안에 포함된 변수는 이름은 없다.
  • 이 변수를 배열의 ‘컴포넌트(component)’라고 부르며, 배열이 n개의 컴포넌트를 갖고 있다면, n을 그 배열의 ‘길이(length)’라고 한다.
public class MyDate{
	int ageOne = 27;
	int ageTwo = 12;
	int ageThree = 82;
	...
}

배열(Array) 선언 및 할당

  • 배열은 타입 또는 변수이름 뒤에 대괄호’[]’를 붙여서 선언한다.
  • 배열 선언 후 할당을 해야만 값을 저장할 공간이 생성된다.
  • 배열은 객체이며 Object reference variable이다. 기본형(Primitive type), 참조형(Reference type)을 다 선언하여 사용할 수 있다.
  • 선언과 할당 Case 2의 경우 선언과 할당을 동시에 한다. 콤마로 구분하여 입력된 개수만큼 배열을 생성한 후 값을 할당한다.
  • 기본 문법
    • 선언: 데이터타입[] 배열변수명; or 데이터타입 배열변수명[];

      int[] ages;
      String names[];
    • 할당: 배열변수명 = new 데이터타입[length];

      ages = new int[3];
    • 선언과 할당 Case 1:
      데이터타입[] 배열변수명 = new 데이터타입[length];

      int[] ages = new int[3];
    • 선언과 할당 Case 2:
      데이터타입[] 배열변수명 = { 콤마(,) 구분자의 배열 개수만큼 값 할당 };

      int[] ages = {20, 15, 33, 42, 19};
      Order[] orders = {new Order(), new Order(100, "주문서")};
  • 생성된 배열 인덱스마다 값을 저장한다.
  • 값을 저장할 때는 저장할 배열의 위치(index)를 저장하고 배열 선언시 지정했던 데이터타입에 맞는 값을 할당한다.
  • index 선언은 0부터 시작한다(지정한 배열개수-1)
    int[] ages = new int[5];
    ages[0] = 20;
    ages[1] = 15;
    ages[2] = 33;
    ages[3] = 42;
    ages[4] = 19;

int[] widths; //선언
widths = new int[3]; //배열 생성
    
//선언과 생성
int[] ages = new int[5];
//int[] ages = {20, 15, 33, 42, 19};
//배열에 값 할당
ages[0] = 20;
ages[1] = 15;
ages[2] = 33;
ages[3] = 42;
ages[4] = 19;
    
//선언, 생성, 값 할당을 동시에 할 수 있다.
Order orders[] = {
	new Order(1, "라면"),
	new Order(2, "세제"),
	new Order(3, "과자")
};
    
//특정 배열 index(위치)의 값 출력
System.out.println(ages[0]);

배열의 활용

  • Array Length: ‘배열이름.length’는 배열의 크기를 알려준다.
    int[] ages = {20, 100, 72, 32, 50};
    for(int i=0; i<ages.length; i++){
    	System.out.println(ages[i]);
    }
  • 배열의 예외(Exception): 배열에 접근시 int값으로 해야하며, long type은 compile time에 에러를 발생시킬 수 있다.
long longLength = 10L;
long longTypeArray = new long[longLength] //compile error
  • 배열에 대한 접근은 runtime에 확인되며, 0보다 작거나 배열 길이보다 크거나 동일한 index(배열의 length와 동일한 값으로 배열은 length-1까지의 index를 가진다)를 사용하면 ArrayIndexOutOfBoundException이 발생한다.
  • 만약 배열의 사이즈를 정의할 때 음수를 사용하게 되면 NegativeArraySizeException이 발생한다.

배열의 메모리

  • 기본 데이터형 배열(Primitive Type Array)
    primitive type array
  • 참조형 배열(Reference Type Array)
Order order = new Order();
Order[] orders = {
	new Order(1, "라면"),
	new Order(2, "세제"),
	new Order(3, "과자")
}

다차원 배열(Array) 선언 및 할당

  • Spreadsheet와 비슷하다. (rows and columns)
  • 1차원 배열과 Syntax가 비슷하며 ‘[]’ 개수가 차원의 수를 의미한다.
  • 2차원 이상의 배열은 가변적으로 생성할 수 있어 가변 배열이라고도 한다.
  • 기본 Syntax
    • 선언: 데이터타입[][] 배열변수면; or 데이터타입 배열변수명[][];

      int[][] ages;
      String names[][];
    • 할당: 배열변수명 = new 데이터타입[1차원 length][2차원 length];

      ages = new int[3][2];
    • 선언과 할당 Case 1:
      데이터타입[][] 배열변수명 = new 데이터타입[1차원 length][2차원 length];

      int[] ages = new int[3][2]; //3행 2열의 2차원 배열을 생성
    • 선언과 할당 Case 2:
      데이터타입[] 배열변수명 = { 콤마(,) 구분자의 배열 개수만큼 값 할당 };

      int[][] ages = {{10,20},{30,40},{50,60}};
  • 2차원 가변 배열의 예
    int[][] ages = new int[5][];
    ages[0] = new int[4];
    ages[1] = new int[2];
    ages[2] = new int[2];
    ages[3] = new int[3];
    ages[4] = new int[2];
    
    //값 할당
    ages[0][1] = 20;
    ...
    ages[4][1] = 17;
    
    int[][] ages =
    {
    	{20,15,33,72},
    	{12,50},
    	{57,20},
    	{27,32,89},
    	{73,17}
    }
profile
웹퍼블리셔의 백엔드 개발자 도전기

0개의 댓글