객체지향 개념

tae_in·2022년 8월 29일
0

자바

목록 보기
8/8

객체지향 언어(프로그래밍 언어 + 객체지향개념(규칙))

  • 객체지향 개념(규칙)들이 추가된 이유
  1. 코드의 재사용성을 높이기 위해(코드를 한 번 만들면 이를 다른대서 쉽게 사용할 수 있도록 하기 위해서 사용)
  2. 유지보수가 용이해서 소프트웨어가 변경이 되도 적은 노력으로 그 변경에 대응할 수 있어서
  3. 코드의 중복을 제거하기 위해

객체지향언어의 핵심적인 특징

  • 캡슐화
  • 상속
  • 추상화
  • 다형성

클래스와 객체

클래스의 정의

  • 설계도
  • 데이터 + 함수
  • 사용자 정의 타입(원하는 타입을 직접 만들 수 있다. )

클래스의 용도

  • 클래스는 객체를 생성하는데 사용한다.

객체의 정의

  • 실제로 존재하는것. 사물 또는 개념

객체의 용도

  • 객체가 가지고 있는 기능과 속성에 따라 다르다.

클래스는 설계도이고 객체는 제품이다.

우리 일상생활에서 하드웨어로 구성되어 있는 것(tv, 오디오 등)을 소프트웨어(프로그램)으로 바꾸려고 하드웨어를 분석하고 관찰해보니 "속성"과 "기능"으로 표현이 가능하였다. 그래서 한 사물(객체)는 속성과 기능으로 구현이 가능하며 속성은 변수, 기능은 메서드로 정의하여 한 사물(객체)의 클래스를 만들 수 있다.

객체와 인스턴스

인스턴스 ≒ 객체

객체: 모든 인스턴스를 대표하는 일반적 용어
인스턴스: 특정 클래스로부터 생성된 객체

클래스로 객체(인스턴스)를 만드는 것을 인스턴스화라고 한다.
클래스(설계도)만 만든다고 제품을 사용할 수 없음.(제품을 의미하는 객체를 생성해야만 사용가능)

하나의 소스파일에 클래스 작성

  • public 클래스의 이름은 무조건 소스파일의 이름과 같아야한다.
    소스파일: A.java , public 클래스: public class A{}

    하나의 소스파일에는 하나의 public 클래스만 존재해야한다.
    소스파일과 같은 이름의 클래스안에 main메서드가 존재해야 한다.

<클래스가 여러개일 때>
(public 클래스가 없을 때)

  • 존재하는 클래스중 main메서드를 가지고 있는 클래스와 소스파일이름이 같으면 문제 없음(클래스 이름과 같은 소스파일이 하나도 없어도 에러는 나지 않지만 실행이 안됨 IDE가 main메서드가 어디있는지 알아야 자동으로 실행이 되는데 소스파일이름을 가지고 판단을 하기 때문에 main메서드를 가지고 있는 클래스 이름이 소스파일이름과 같아야한다.)
    (소스파일과 같은 이름의 클래스안에 main메서드가 존재해야 한다!)
  • 자바는 대소문자를 구별하므로 (소스파일: Hello.java 클래스: class hello{}는 다른거다.)

(public 클래스가 있을 때)

  • public 클래스는 무조건 1개만 존재해야하고 public 클래스 이름이 소스파일의 이름과 같기만 하면 문제 없음(public 클래스 내부에 main메서드 존재)

<클래스가 한개일 때>

(public 클래스가 있을 때, 없을 때)

  • 클래스 이름이 소스파일과 같아야한다.(클래스 안에 main메서드 존재)

객체의 생성과 사용

객체의 생성

  1. 참조변수를 선언
  2. 객체를 생성
  3. 대입연산자로 참조변수와 객체를 연결
클래스명 변수명;  		 // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명();   //클래스의 객체를 생성한 후(new 클래스명()), 객체의 주소를 참조변수에 저장

(2줄을 1줄로)
클래스명 변수명 = new 클래스명(); (Tv tv = new Tv();)
  • 참조변수는 객체를 다루기 위해서 필요하다. 참조변수가 없으면 객체를 다룰 방법이 없다.
    (ex) 클래스: tv 설계도, 객체: tv, 참조변수: 리모컨 )

객체의 사용

tv.channel =7; // 변수(속성)를 사용하는 방법
tv.channelDown(); // 메서드(기능)을 사용하는 방법 (메서드 호출이라고도 함)

객체를 사용한다는 말은 객체가 가진 멤버를 사용한다는 말이며 멤버는 변수하고 메서드이다.

new 연산자

new 연산자는 객체를 만들고 그 객체의 주소값을 반환한다. (new 연산자로 만들어지는 객체의 주소값은 같을 수 없다. 사용되고 있는 메모리를 피헤서 빈 자리에 객체를 만들기 때문)
ex) Tv tv = new Tv(); // (new 연산자가 반환한 주소값이 0x100이라고 가정)tv에는 0x100이 저장이 된다.(대입연산자에 의해) 즉, 참조변수에 생성된 객체의 주소값이 저장된다.(대입연산자로 참조변수와 객체를 연결). 참조변수의 타입과 생성하려는 객체의 타입이 같아야한다.(tv(제품)에 맞는 리모컨(참조변수)를 생성)

Tv tv1 = new Tv(); 
Tv tv2 = new Tv();  
tv1.channel = 7;

tv1가 tv2에는 다른 주소 값이 저장된다. 그러므로 tv1.channel = 7로는 tv1이 가지고 있는 주소값에 해당하는 객체만 값이 변한다.
Tv tv1 = new Tv(); 
Tv tv2 = new Tv();  
tv2 = tv1; // (tv2의 값이 0x200이고 tv1의 값이 0x100이라고 가정하면 이 코드로 인해 tv2의 값이 0x100으로 바뀌게 된다.
그러면 tv2와 연결된 객체(객체주소: 0x200)은 tv2리모컨과 연결이 끊어지게 되고 tv1과 연결된 객체(객체 주소: 0x100)는 리모컨이 2개가 된다.(tv1, tv2)) 
tv2와 연결됬었던 객체(객체주소: 0x200인 객체)는 존재는 하지만 사용할 수 없게 된다.(참조변수(리모컨)가 없기 때문에) 
tv1.channel = 7;  // tv1.channel값도 7이고 tv2.channel값도 7이된다.

<자바는 Garbage Collector가 존재한다.>
사용할 수 없는 메모리는 Garbage Collector가 메모리를 주기적으로 확인하고 있다가 사용할 수 없는 객체를 찾으면 메모리에서 제거시켜 불필요하게 메모리가 낭비되지 않도록한다.

변수는 하나의 값만 저장가능해서 한 객체에 참조변수가 여러개일순 있지만 참조변수 하나가 여러개의 주소를 가질 수는 없다.(참조변수는 하나의 객체와만 연결 가능)

객체 배열

객체 배열 == 참조변수 배열
(참조변수 배열이지만 참조변수들 안에 객체의 주소가 저장됨, 참조변수 여러개를 묶어서 하나의 배열로 만든 것)

 Tv tv1, tv2, tv3  -> Tv[] tvArr = new Tv[3];  // Tv타입의 참조변수 3개 생성, 초기화는 tvArr[0], tvArr[1], tvArr[2]모두 null로 된다. 
 그리고 tvArr의 값은 new 연산자로 Tv타입의 참조변수를 3개 생성했을 때의 첫번 째 tvArr[0]의 주소 값을 가지게 된다.
 
 tvArr[0] = new Tv(); // Tv객체를 생성하여 참조변수(tvArr[0])와 연결시켜줌 
 tvArr[1] = new Tv(); // Tv객체를 생성하여 참조변수(tvArr[2])와 연결시켜줌
 tvArr[2] = new Tv(); // Tv객체를 생성하여 참조변수(tvArr[1])와 연결시켜줌
 (tvArr[0], tvArr[1], tvArr[2]이 가지고 있는 주소값은 모두 다름)
 
 
(위의 코드를 줄여서)
Tv[] tvArr = {new Tv(), new Tv(), new Tv()};

0개의 댓글