JAVA 2일차.

김재현·2022년 7월 29일
0

Java

목록 보기
2/15
post-thumbnail

객체지향 언어

  • 기존의 프로그램이 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 프로그래밍 언어.

특징

  1. 코드 재사용성이 높음.
    새로운 코드를 작성할 때 기존 코드를 이용해 쉽게 작성할 수 있음.
  2. 코드의 관리가 용이.
    코드간의 관계를 이용해 적은 노력으로 쉽게 코드 변경 가능.
  3. 신뢰성이 높은 프로그래밍을 가능하게 함.
    제어자와 메서드를 이용해 데이터를 보호하고 올바른 값을 유지, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작 방지.
  • 가장 큰 장점은 '코드의 재사용성이 높고 유지보수가 용이하다.'는 점.
    이 점은 프로그램의 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선했다.

클래스와 객체

  • 클래스란 '객체를 정의해 놓은 것', 혹은 '객체의 설계도 또는 틀'
    클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됨.

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념.
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다르다.
유형의 객체 : 사물.
무형의 객체 : 여러 논리가 개념.

  • 클래스를 작성한 다음, 클래스로부터 객체를 생성해 사용한다.
    클래스를 잘 만들어 놓으면 이후 객체를 만들어서 사용하기 좋다.

객체의 구성요소

  • 객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있다.
    일반적으로 다수의 속성과 다수의 기능을 갖음.
    즉, 객체는 속성과 기능의 집합이라 할 수 있음.
  • 클래스에는 객체의 모든 속성과 기능이 정의되어 있음.
    객체를 생성하면 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것.
  • 속성은 변수, 기능은 메서드로 표현됨.

    객체의 속성 : 변수
    객체의 기능 : 메서드

인스턴스

  • 클래스에서 객체를 만드는 과정을 '클래스의 인스턴스화'라고 하며, 만들어진 객체를 그 클래스의 '인스턴스, instance'라고 한다.
  • 객체는 모든 인스턴스를 대표하는 포괄적인 의미.
    인스턴스는 어떤 클래스로부터 만들어진 것인지를 보다 강조하는 의미.

    클래스 >> 인스턴스화 >> 인스턴스(객체)

여러 클래스 작성하기

  • 소스파일의 이름은 public class의 이름과 일치해야 함.
  • 하나의 소스파일에 둘 이상의 public class가 존재하면 안됨.

객체의 생성과 사용

  • 클래스 선언에 이어 클래스의 인스턴스를 작성해야 클래스를 사용할 수 있음.
클래스의 변수 명;            // 클래스의 객체를 참조하기 위한 참조변수 선언.
변수명 = new 클래스명();     // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장.
  • 각 인스턴스의 속성(멤버 변수)는 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일함.
TV t1 = new TV();    // t1, t2는 변수
TV t2 = new TV();
t1.channel = 7;      // t1이 가리키고 있는 인스턴스 멤버변수 channel 의 값을 7로 변경

객체 배열

  • 많은 수의 객체를 다룰 때 배열로 다루면 편리하고, 객체를 배열로 다루는 것을 '객체 배열'이라고 함.
    객체 배열 안에는 객체가 직접 저장되는 것이 아닌, 객체의 주소가 저장됨.
    객체 배열은 참조변수를 하나로 묶은 참조변수 배열인 것.
TV tv1, tv2, tv3;    >>>> TV[] tvArr = new TV[3];
  • 객체 배열을 생성하는 것은, 객체를 생성하는 것이 아닌 참조변수를 만든 것. 객체를 생성해서 객체 배열의 각 요소에 저장하는 것을 잊으면 안된다.
TV[] tvArr = new TV[3];  // 참조변수 배열(객체배열) 생성
tvArr[0] = new TV();
tvArr[1] = new TV();
tvArr[2] = new TV();
  • 배열의 초기화 블럭을 사용하면, 다음과 같이 한 줄로 할 수 있다.
    TV [] tvArr = { new TV(), new TV(), new TV() };
  • 다뤄야할 객체의 수가 많을 때는 for문 사용.
TV [] tvArr = new TV[100];
for(int i=0; i < tvArr.length; i++){
		tvArr[i] = new TV();
}

클래스의 정의(1) - 데이터와 함수의 결합

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간.
  2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간.
  3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간.
  4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)
  • 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 함.
    관련된 변수들을 정의하고, 작업을 수행하는 함수들을 함께 정의한 것이 바로 클래스.

    String이라는 클래스로 문자열을 다루는데, 문자열을 단순히 문자의 배열로 정의하지 않고 클래스로 정의한 이유는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶기 위해서이다.

클래스의 정의(2) - 사용자 정의 타입

  • 기본적으로 제공하는 기본 자료형(primitive type) 외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입(user-defined type)이라고 한다.
  • 클래스가 곧 사용자 정의 타입이며, 기본형은 8개로 정해져 있지만, 참조형의 개수가 정해져 있지 않은 이유는 프로그래머가 새로운 타입을 추가할 수 있기 때문.
int hour;
int minute;
float second;

변수가 늘어나면 
int hour1, hour2, hour3;
int minute1 ,minute2, minute3;
float second1, second2, second3;

변수가 늘어나면 배열로 표현할 수 있다. 
int [] hour = new int[3];
int [] minute = new int[3];
float [] second = new float[3];
  • 하나의 시간을 구성하는 시, 분, 초가 분리되어 정의되어 있기 때문에 프로그램 수행 과정에서 뒤섞여 올바르지 않은 데이터가 될 가능성이 있다.
    이럴 경우 시, 분, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의해서 사용한다.
class Time { 
	int hour;
    int minute;
    float second;
}
  • 객체지향언어에서는 시간에 추가되어야 할 여러 조건을 제어자와 메서드를 이용해서 코드에 쉽게 반영할 수 있다.
public class Time {
	private int hour;
    private int minute;
    private float second;
    // hour 값을 변경하기 위한 메서드로 지정한 값이 0보다 작거나 23보다 크면
    // 즉 유효한 값이 아니면 변경하지 않고 메서드를 종료(return) 한다.
    public void setHour(int h){
    	if (h <  0 || h > 23) return;
        hour = h;    //지정된 값(h)가 유효한 경우에만 hour 변경
    }
}

제어자를 이용해 변수의 값을 직접 변경치 못하게 하고, 대신 메서드를 통해 값을 변경하도록 작성했으며, 값을 변경할 때 지정된 값의 유효성을 조건문으로 점검한 후 유효한 값일 경우에만 변경한다.

선언위치에 따른 변수의 종류

  • 변수는 클래스, 인스턴스, 지역변수 세 가지 종류가 있다.
    '변수의 선언 위치'가 변수의 종류를 결정짓는 중요한 요소이므로 변수가 어누 영역에 선언되었는지 확인하는 것이 중요하다.
    • 멤버 변수를 제외한 나머지 변수들은 모두 지역 변수
    • 멤버 변수 중 static이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수.
변수의 종류선언위치생성시기
클래스 변수클래스 영역클래스가 메모리에 올라갈 때
인스턴스 변수클래스 영역인스턴스가 생성되었을 때
지역변수클래스 영역 의외의 영역( 메서드, 생성자, 초기화 블럭 내부)변수 선언문이 수행되었을 때
  1. 인스턴스 변수
    클래스 영역에 선언되며, 인스턴스를 생성할 때 만들어진다.
    인스턴스 변수(iv)의 값을 읽어오거나 저장하려면 먼저 인스턴스를 생성해야한다. 인스턴스마다 별도의 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
    인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언.
  2. 클래스 변수
    인스턴스 변수 앞에 static을 붙이기만 하면 선언할 수 있다.
    클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스 변수로 선언해야 한다.
    인스턴스를 생성하지 않고 언제라도 바로 사용할 수 있다는 특징.
    '클래스 이름. 클래스 변수'와 같은 형식으로 사용한다.
  3. 지역 변수
    매세드 내에 선언되어 메서드 안에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없다.
    for, while문의 블럭 내에 선언된 지역 변수는, 지역변수가 선언된 블럭{} 안에서만 사용 가능하며, 블럭{}을 벗어나면 소멸되어 사용할 수 없게 된다.

클래스 변수와 인스턴스 변수

  • 카드로 비유해볼 경우.
    카드의 속성으로는 무늬, 숫자, 폭, 높이 등을 추측할 수 있음.
    클래스는 카드. 변수는 무늬, 숫자, 폭, 높이.
class Card{ 
	String kind;    // 무늬
    int number;     // 숫자
    static int width = xxx;     // 폭
    static int height = yyy;    // 높이
}
  • 각 Card 인스턴스는 각자의 무늬(kind)와 숫자(number)를 유지해야 하므로 이들은 인스턴스 변수.
  • 카드의 폭(width)과 높이(height)는 모든 인스턴스가 같은 값을 가져야하므로 클래스 변수로 선언.
  • 클래스 변수, width와 height 의 값은 xxx와 yyy의 값이 변경된다면 모든 폭과 높이의 값이 변경된다.

    인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 갖을 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 공통된 값을 갖는다.

0개의 댓글