728x90
  • 객체지향언어의 주요 특징
    • 코드의 재사용성이 높다.
    • 코드의 관리가 용이하다.
    • 신뢰성이 높은 프로그래밍을 가능하게 한다.
  • 클래스란 '객체를 정의해 놓은 것' 또는 '객체의 설계도 또는 틀'이라고 정의할 수 있다.
  • 객체의 사전적 정의는 '실제로 존재하는 것'이다.
    프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
  • 객체는 속성과 기능으로 이루어져 있으며 객체가 가지고 있는 속성과 기능을 해당 객체의 멤버라고 한다.
  • 클래스로부터 객체를 만드는 과정을 인스턴스화(instantiate)라고 하며 그 결과 만들어진 객체를 인스턴스(instance)라고 한다.
  • 하나의 소스파일 내에 하나의 클래스만을 정의하는 게 일반적이지만 두 개 이상의 클래스를 작성하는 것도 가능하다. 이때 public class가 있는 경우 파일 명은 해당 클래스명과 동일해야 한다.
  • 소스파일(*. java)과 달리 클래스파일(*. class)은 클래스마다 하나씩 생성되기 때문에 하나의 소스파일에 여러 클래스를 선언해도 각 클래스별로 클래스파일이 생성된다.
  • new를 통해 객체를 생성 후 이를 참조변수에 저장할 경우, 생성된 객체의 주소값이 참조변수에 저장된다.
  • 변수는 클래스 변수, 인스턴스 변수, 지역변수 세 종류가 있다.
    멤버변수를 제외한 나머지 변수들은 모두 지역 변수이며, 멤버 변수 중 static이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수이다.
    • 클래스 변수
      모든 인스턴스가 공통된 저장공간을 공유하게 된다. 인스턴스를 생성하지 않고 바로 사용가능하다는 특징이 있다. 선언 위치는 클래스 영역이며 클래스가 메모리에 올라갈 때 생성된다.
    • 인스턴스 변수
      사용하기 위해선 인스턴스를 생성해야 한다. 인스턴스마다 별도의 저장공간을 가지므로 같은 변수명일지라도 서로 다른 값을 가질 수 있다. 선언 위치는 클래스 영역이며 인스턴스가 생성될 때 생성된다.
    • 지역변수
      메서드, 생성자 등 클래스 영역 이외의 영역에 선언되는 변수로 메서드가 종료되면 소멸되어 사용할 수 없다.
  • 메서드란 '특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것'이다.
  • 메서드의 수행과정을 전혀 알지 못하더라도 과정에 필요한 입력값과 출력되는 값에 대한 정보만 알고 있으면 사용하는데 문제가 없다. 때문에 메서드를 블랙박스라고도 한다.
  • 메서드는 선언부(header)와 구현부(body)로 구성되어 있다.
  • 선언부에는 '메서드의 이름'과 '매개변수 선언', 그리고 '반환타입'으로 구성되어 있다.
    • 매개변수 선언 시 일반적은 변수 선언과는 다르게 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.
    • 반환타입에는 수행결과인 반환값의 타입을 작성한다. 만약 반환값이 없을 경우에는 void로 작성한다.
  • 반환타입이 void가 아닌 경우 구현부에는 return 이 반드시 포함되어야 한다.
    이때 반환값의 타입은 반환 타입과 일치하거나 적어도 자동 형변환이 가능한 것 이어야 한다.
  • 원래는 반환값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return 문이 있어야 한다.
    그런데도 반환타입이 void인 경우, return 문이 없어도 아무런 문제도 없는데 이유는 컴파일러가 메서드의 마지막에 'return;'을 자동적으로 추가해 주었기 때문이다.
  • 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.
  • 메서드가 호출되면 호출스택에 메서드를 위한 메모리가 할당되며 작업을 수행하는 동안 지역변수들과 연산의 중간 결과 등을 저장하는 데 사용된다.
  • 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비어진다.
  • 자바에서 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 
    이때 기본형 일 때는 값이 복사되지만 참조형일 때는 인스턴스의 주소가 복사된다.
    때문에 메서드 내에서 값을 변경하는 작업이 있을 때 참조형은 지역변수가 변경되어 원본에는 아무런 영향을 끼치지 못하지만 참조형은 복사된 인스턴스 주소의 변수를 변경하여 원본에 영향을 줄 수 있다.
  • 메서드도 선언부에 static이 붙어있으면 클래스메서드이다. 클래스변수와 마찬가지로 인스턴스를 생성하지 않고 사용할 수 있다.
  • 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조, 호출이 가능하다.
    단, 클래스 멤버가 인스턴스멤버를 참조, 호출할 경우 인스턴스를 생성해야 한다.
    인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다.
  • 한 클래스 내에 이름이 같은 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩'이라고 한다.
  • 오버로딩이 성립하기 위해서는 아래와 같은 조건을 만족해야 한다.
    • 메서드 이름이 같아야 한다.
    • 매개변수의 개수 또는 타입이 달라야 한다.
  • 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
  • 생성자를 작성하지 않아도 문제가 되지 않았던 이유는 컴파일러가 제공하는 기본생성자 덕분이었다.
  • 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때뿐이다.
  • 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.
    단, 아래의 조건을 만족시켜야 한다.
    • 생성자의 이름으로 클래스이름 대신 this를 사용한다.
    • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
  • 변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.
  • 멤버변수(클래스변수, 인스턴스변수)와 배열의 초기화는 선택이지만, 지역변수의 초기화는 필수이다.

+ Recent posts