자바의 추상클래스는 사실 어떻게 사용하는가도 중요하지만 추상클래스를 왜 사용해야하는가? 이게 더 중요한 문제인것 같다.
자바라는 객체 지향 프로그래밍에서 제일 중요한것은 클래스를 통한 객체화이다. 클래스를 여러가지 생성해서 각 클래스마다 특징을 규정하고 여러 클래스들을 상속받고 결합하고 지지고볶고 해서 프로그램을 구현해낸다.
그것이 절차 지향과의 큰 차이점인데 프로그램을 순서대로 구현하는 것이 아닌 각각 부분을 구현 해놓은 뒤 필요하면 가져와서 사용하는 것이다. 그것이 객체 지향 프로그래밍의 사용 방법이다.
여기서 추상클래스란 무엇인가 말그대로 실체를 가진것이 아닌 추상적인 클래스라는 것인데,
클래스 앞에 abstract가 붙으면 이 클래스는 추상적인 클래스가 되서 안에 존재하는 모든 변수, 메서드 등등을 객체화 시킬수 없다. 그럼 객체화도 못시키는데 왜 이런 쓸데없는것을 만드냐? 라고 하면 제일 먼저 떠오르는 답변은 이것이다.
"프로그램의 설계와 구현을 구분하기 위해 사용합니다."이다.
예를 들어, 개발자 여러명이 한 프로그램을 공동으로 개발하고 있다고 치자, 각자 다른 파트를 맡아서 개발하겠지만 이럴 경우 하나의 공통되 변수 명, 메소드 명이 필요하다 왜냐하면 프로그램을 구현한다 치면 나중에 그 코드를 보고 수정 및 유지보수를 할 사람을 위해서라도 변수가 중구난방으로 되면 안되고 하나로 통일될 필요가 있다.
예를 들어 인간과 개는 하나의 동물이라는 큰 범위에 묶이게 된다.
이를 프로그램으로 만든다고 치면,
인간은 2족보행을 하고 개는 4족보행을 한다. 이렇게 각각의 특징은 다르지만, 걷는다 라는 특성은 공유하게 된다.
그러면 걷는다라는 메소드를 만들어 놓고 그걸 가져오기만해서(오버라이딩) 인간과 개라는 클래스에 각각 2족보행과 4족보행을 각각 구현해 놓기만 하면 된다.
그러면 둘다 메소드 walk라는 메서드로 묶이게 되겠지만 실제 가동되는 것은 클래스에 따라 달라지게 되는것이다.
이 프로그램 구현에 참여하지 않은 새로운 사람이 이 코드를 봤을때 이걸보고 아 걷는다를 표현하기 위해 사용했구나라고 한눈에 알아볼수 있게되는것이다.
위는 메소드를 예로 들은건데 이렇게 변수와 메소드 등 프로그램에 자주 사용해야 할 경우 하나의 추상클래스에 담아놓고 이를 오버라이딩하여 각 클래스에서 재정의 하면 된다.
이는 곧 제일 위에 적었던 설계와 구현의 구분을 말하는 것이다.
프로그램에 계속 사용될 변수와 메서드를 설계를 위한 클래스에 담아놓고 구현을 위한 클래스로 실체화시켜 프로그램을 짜는것이다.
그렇기에 위에서 말했듯이 추상클래스에서 오버라이딩해서 사용해야 하지. 추상클래스를 객체화 시킬 수 없다.
그리고 이는 시간절약을 할 수있다.
SI에서 프로젝트에 들어가면 고급개발자 쯤 되는 분들(아키텍쳐라고 하는데)이 미리 추상클래스에 필요한 변수와 메서드를 만들어 놓는다. 우리는 가서 그것을 오버라이딩 해서 사용하면 되는것이다.
그렇기에 상속과 추상화에 대해 자세하게 알고 그것을 사용 할 수 있어야 한다.
다음은 사용방법에 대해 알아보자.
추상클래스는 class선언부 앞에 abstract를 적으면 된다.
이렇게 적으면 이 동물이라는 클래스는 추상클래스이고 life라는 변수를 갖게 된다.
이를 상속한 클래스들은 life라는 변수를 사용할 수 있게 되는것이다.
이 애니멀이라는 추상클래스를 버드라는 추상 클래스로 상속시켰다.
그러면 버드는 자연적으로 추상클래스인 애니멀 클래스의 life의 변수도 갖게 되는것이다.
오리라는 클래스가 다시 위의 버드를 상속 받았다.
이런 경우 오리는 버드의 특성(변수, 메서드), 그리고 추상클래스인 애니멀의 특성(라이프)도 모두 가지게 된다.
여기서 다형성이 발생된다. 클래스 변수명과 메서드명이 통일되게 사용되었다는것을 볼 수 있다.
여기서 중요하게 알아야 할 점은,
여기서 버드 또한 추상 클래스였는데 만약에 추상클래스를 상속받아 사용할때 포함된 메서드를 재정의(오버라이딩) 해주지 않으면 그 클래스또한 자동적으로 추상클래스화가 된다.
즉, 추상화로 계속 특징을 상속시키고 오리라는 클래스안에서 그 받아온 것들을 이용하여 프로그램을 구현한다는 말이다.
이렇게 사용방법을 간단하게 알아봤는데 결국 왜 쓰는지 알고 쓰는게 중요하다. 다른 블로그들 보면 왜써야하는지에 대해 또 자세히 설명해놓은 블로그들도 많은데 이걸보고 부족하다 생각이 되면 다른 곳에서 또 내용을 찾아봐도 괜찮을것 같다. 그만큼 자바 객체지향에서 중요한 개념이기도 하고 어떻게 보면 전부인 개념이기도 한것 같다.
다른건 몰라도 추상화, 다형성, 상속, 캡슐화 등등 중요한 것들은 꼭 알고 실무로 가길 바란다.(나도 더 공부가 필요한듯ㅋㅋ)
'개발 > JAVA' 카테고리의 다른 글
[JAVA]자바 Random 클래스를 활용한 로또 프로그램(중복제거, 순서정렬) (0) | 2021.03.05 |
---|---|
[JAVA] 자바 객체배열을 사용한 전화번호 출력 프로그램2 (0) | 2021.03.03 |
[JAVA] 자바 객체배열을 사용한 전화번호 출력 프로그램 (0) | 2021.02.28 |
[JAVA] 자바 업캐스팅, 다운캐스팅 (0) | 2021.02.22 |
[JAVA] 자바 static의 사용 (0) | 2021.02.20 |