CS
CS) 객체지향(OOP)
chanyoun
2023. 2. 8. 17:25
객체지향이란
- 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만든후 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
- 장점
- 코드 재사용성이 높다
- 상속 등을 통하여 기존의 코드를 재사용할수 있다.
- 코드 관리가 용이하다
- 코드 간의 관계를 이용해 적은 노력으로 쉽게 코드변경이 가능하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 코드의 중복제거, 제어자와 메서드를 이용해 데이터를 보호 및 올바른 값을 유지하도록하여 오동작을 방지할수 있다.
- 코드 재사용성이 높다
용어
- 클래스
- 클래스란 객체를 정의해 놓은것, 즉 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.
- 객체
- 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
- 인스턴스화
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 라고한다.
- 인스턴스
- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스 라고한다.
- 콜렉션(Collection)
- 인스턴스 여러개의 모임
프로그래밍 구조
속성과 기능
- 클래스란 객체를 정의한 것이다 따라서 클래스에는 객체의 모든 속성, 기능이 정의되어 있다.
- 객체지향에서는 속성을 멤버변수를 통해 기능은 메서드를 통해 표현한다.
캡슐화
- 캡슐화란 클래스의 내부 변수와 메소드를 하나로 패키징 하는 특징이다.
- 객체에 선언된 변수 또는 메소드가 어떠한 제한없이 누구나 접근할수 있다면 정상적인 객체로 보기 힘들다 따라서 캡슐화를 사용한다.
- JAVA에서는 접근제어자를 통해 객체의 캡슐화, 은닉화를 구현한다.
상속
- 상속이란 객체가 다른 객체를 상속받아 상속받은 객체의 요소를 사용하는것을 의미한다.
- 상속을 통해 코드의 재사용성과, 확장성, 유지보수성, 최상위 클래스 구조를 통한 하위클래스의 동작을 예측할수 있다는점에서 프로그램 구조에대한 이해도 향상등.. 다양한 장점이있다.
다형성
- 다형성이란 하나의 객체 혹은 메소드가 여러 타입을 참조할수 있음을 의미한다.
즉 자식객체가 부모의 타입에 들어갈수있다. - 다형성은 크게 객체의 다형성, 메소드의 다형성으로 구분된다.
객체의 다형성
- 객체의 다형성이란 객체가 상속된 부모 객체의 인스턴스로 할당될수 있음을 의미한다.
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
Account card = new CheckingCard();
}
}
위 코드에서 CheckingCard 는 Account를 상속받았다.
이때 Account card = new Account() 로 객체를 생성하는 대신 위와같이 객체를 생성할수 있다는게 바로 다형성중 객체의 다형성이다.
메소드의 다형성
- 메소드의 다형성이란 메소드가 서로 동일한 이름을 가지더라도, 입력받는 파라미터가 다르면 각각 개별적인 메소드로 취급을 의미한다.
public class Main
{
public static void main(String[] args)
{
System.out.println("문자");
System.out.println(1234);
System.out.println(true);
}
}
- 위 코드에서 사용한 println 메소드는 입력되는 파라미터가 문자열,숫자,bool 타입으로 다 다르지만 잘 처리하는것을 볼수있는데 이러한 이유는 println메소드가 다형성을 통해 정의되어있기 때문이다..
추상화
- 추상화란 클래스 정의시 불필요한 부분을 생략하고 객체의 속성중 중요한것에만 중점을 두어 개략화 하는것을 말한다.
즉 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼 클래스를 선정하는 개념이다.
캐스팅
- 캐스팅이란 타입을 변환한다는 것이다.
캐스팅의 종류는 업 캐스팅 과 다운 캐스팅 2가지이다.
- 업 캐스팅
- 업 캐스팅이란 자식 클래스가 부모 클래스 타입으로 캐스팅이 되는것을 말한다.
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
CheckingCard child = new CheckingCard();
Account parent = child;
}
}
- 위와 같은 코드가 있을때 Account parent = child 부분이 자식클래스가 부모 클래스 타입으로 캐스팅이 된 부분이다.또한 이때 명시적인 타입캐스팅 Account parent = (Account) child; 와 같이 (Account)를 붙여줄 필요가 없다.
- 업캐스팅을 통해 수퍼클래스의 참조변수 parent가 서브클래스의 인스턴스를 가리킬수 있게 된것이다.
주의
- 업캐스팅을 하게되면 부모의 참조변수를 통해 자식의 인스턴스를 지정한다. 따라서 자식 클래스에 있는 속성과 메서드는 실행할수 없게 된다.
- 업 캐스팅후 메소드 실행시, 자식클래스에서 오버라이딩한 메서드가 있을경우, 부모 클래스의 메소드가아닌 오버라이딩한 메소드가 실행되게 된다.
업 캐스팅 사용이유
- 업케스팅을 하게되면 상속관계에서 상속받은 서브클래스의 개수에 상관없이 하나의 인스턴스로 묶어 관리가가능하다.
- 위 와 같은 코드에서 만약 Account 를 상속받은 다른 서브 클래스가 있더라도 업캐스팅을 통해 Account[] a = new Account[]; 라는 a배열을 통해 서브 클래스들을 한번에 정리하는등.. 가독성과 유지보수성을 높일수있다.
- 다운 캐스팅
- 다운 캐스팅은 업캐스팅과 반대로 부모 클래스가 자식 클래스의 타입으로 캐스팅이 되는것을 말한다.
- 주의
- 다운캐스팅은 업캐스팅과는 반대로 캐스팅 연산자를 생략할수 없다
- 다운 캐스팅 사용이유
- 다운캐스팅은 우리가 업캐스팅한 객체를 다시 자식클래스 타입의 객체로 되돌리는데 목적이 있다.
instanceof 연산자
- instanceof 연산자를 통해 어느 객체 변수가 어느 클래스 타입인지 판별해준다 (return 값은 true/false).
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
CheckingCard child = new CheckingCard();
Account parent = new Account();
System.out.println(parent instanceof CheckingCard); // false
System.out.println(parent instanceof Account); // true
System.out.println(child instanceof Account); // true
}
}
- 위 코드에서 보면 parent는 CheckingCard(자식)의 인스턴스가 아니기때문에 false가 출력된다.
- 반면 3번째 출력문에서 child는 Account(부모)의 인스턴스로도 보기때문에 false가 아닌 true가 나온다.