-
7일차 - JAVA 객체지향 프로그래밍(클래스, 인스턴스)프로그래밍 언어/JAVA 2021. 4. 9. 15:14
오늘은 객체지향 프로그래밍을 이해하기 위해 알아야할 클래스, 인스턴스에 대해 배웠다.
python을 배울 때와는 다른 느낌인거 같다. 약간 JAVA에서 배운 클래스와 인스턴스가 더 이해가 잘 되는 느낌?
앞으로 프로젝트를 수행할 때 객체지향적으로 짜야할텐데 마음처럼 잘 될지는 걱정된다.
<핵심정리>
1. 객체지향 프로그래밍이란?
오늘 배운 클래스와 인스턴스에 대해 정리하기 전에 객체지향 프로그래밍에 대해 짧게 얘기해보고 넘어가려고 한다.
객체지향 프로그래밍의 정의를 찾아보면 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이라고 나온다.
내가 이해한 것으로 풀어서 얘기해보면 우리가 코드를 짤 때 어떠한 기능을 구현하려하고 코드 간의 유사하거나 관계가 존재하는 것들이 있을 것이다.그러한 것들을 객체라는 것으로 묶어 일정한 형태를 유지하여 프로그래밍하는 것이라고 생각한다.
2. 클래스
클래스에 대한 간단히 정의하면 서로 연관된 메소드와 변수를 하나의 묶음으로 만든 것이 클래스이다.그러면 이러한 클래스를 왜 쓸까?클래스를 쓰기 전을 생각해보면 main메소드 안에 우리가 필요한 코드를 쓰고 메스드도 만들어서 쓰고 변수도 쓰고 하면 매우 길어지고 무언가 불편해보인다.이러한 것들 중에 서로 연과되어 보이는 메소드와 변수를 묶어서 클래스로 만들면 main코드가 깔끔해질 수 있다.
또한, 클래스의 이름과 메소드의 이름을 보면 다른사람이 코드를 봤을 때 이해하기 쉽고 이해가 안된다면 해당 클래스의 메소드의 코드를 찾아서 보면 편하게 알 수 있다.
그리고 코드의 중복성 방지와 버그를 수정할 때 클래스의 해당 부분을 수정만 하면되기 때문에 간편해진다.
3. 인스턴스
인스턴스는 한 마디로 표현하면 클래스라는 틀에서 똑같이 만들어진 복제본? 같은 것이다.
비유하자면 거푸집에서 만들어진 청동칼? 붕어빵 틀이 클래스라면 만들어진 붕어빵은 인스턴스 같다는 느낌이다.
만약, 클래스로 인스턴스를 만든다면 그 인스턴스를 바꾼다 해도 클래스에게는 영향이 가지 않습니다.
그러면 인스턴스를 사용하면 뭐가 좋을까?
인스턴스화 하지 않고 변수와 메소드를 그대로 사용한다면 변수를 바꾸고 메소드를 불러오고를 반복하면서 코드가 반복되는 부분이 발생하고 길어질 것이다.
하지만, 이렇게 반복적으로 부르고 같은 부분이 있다면 그것을 인스턴스화한다면 중복성이 제거될 수 있다.
4. Static
어제 Static에 대해 책 뒷부분의 부록같은 느낌으로 배웠다. 오늘은 이 Static에 대해 경우를 가정하면서 더 자세히 배웠다.
생활코딩님의 강의를 보면 위 그림을 이해하면 static에 대해서 어느정도 안 것이라고 말했다.
풀어서 설명해보면 static 변수와 메소드는 클래스에서 생성된 모든 인스턴스가 공유할 수 있습니다.
하지만, static으로 선언되지 않은 인스턴스 변수와 메소드는 클래스에서 바로 접근이 불가합니다.
class Foo{ public static String classVar = "I class var"; public String instanceVar = "I instance var"; public static void classMethod() { System.out.println(classVar); // 가능(static 메소드에서 static 변수 접근 가능) // System.out.println(instanceVar); // 불가능(static 메소드에서 인스턴스 변수 접근 불가능) } public void instanceMethod() { System.out.println(classVar); // 가능(인스턴스 메소드에서 static 변수 접근 가능) System.out.println(instanceVar); // 가능(인스턴스 메소드에서 인스턴스 변수 접근 가능) } } public class StaticApp { public static void main(String[] args) { System.out.println(Foo.classVar); // 가능 (클래스로 static 변수 접근 가능) // System.out.println(Foo.instanceVar); // 불가능 (클래스로 인스턴스 변수 접근 불가능) Foo.classMethod(); // 가능 (클래스로 static 메소드 접근 가능) // Foo.instanceMethod(); // 불가능 (클래스로 인스턴스 메소드 접근 불가능) Foo f1 = new Foo(); // f1으로 인스턴스 생성 Foo f2 = new Foo(); // f2로 인스턴스 생성 // System.out.println(f1.classVar); // 결과: I class var System.out.println(f1.instanceVar); // 결과: I instance var // f1.classVar = "changed by f1"; // 인스턴스에서 클래스 변수 변경 System.out.println(Foo.classVar); // 결과: changed by f1 (클래스 내의 static변수가 같이 변경됨) System.out.println(f2.classVar); // 결과: changed by f1 (클래스 내의 static변수가 변경되어 f2 인스턴스에서 static변수를 선언하면 변경된 것으로 호출) // f1.instanceVar = "changed by f1"; // 인스턴스에서 인스턴스 변수 변경 System.out.println(f1.instanceVar); // 결과: changed by f1 (f1에서 인스턴스 변수를 변겨했으므로 변경된 값으로 호출) System.out.println(f2.instanceVar); // 결과: I instance var (f1 인스턴스에서 인스턴스 변수를 변경했으므로 f2인스턴스에서 호출하면 해당 클래스의 인스턴스 변수가 호출) // 즉, 인스턴스에서 클래스 변수를 변경하면 클래스 내의 클래스 변수도 같이 변경 // 반면에 인스턴스에서 인스턴스 변수를 변경하면 클래스 내의 인스턴스 변수는 변경 안됨. } }
코드로 예시를 들면서 주석에 결과와 이유를 설명해 보았다.
---------------------------------------------------------------------------------------------
<7일차 후기>
앞으로 중요하게 여겨야할 객체지향이라는 개념, 그리고 코드를 구현할 때도 지금은 많이 공감은 안되지만 복잡할수록 객체지향적으로 프로그래밍해야되겠다는 생각이 들었다.쉽게 배우는 자바2를 완강하고 간단한 프로젝트를 진행할 생각인데 처음부터 객체지향적으로 클래스를 만들고 메소드를 만드는게 힘들겠지만 마지막 완성본에는 그렇게 해보도록 노력해야겠다.
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
9일차 - JAVA 인터페이스 (0) 2021.04.12 8일차 - JAVA 상속 (0) 2021.04.11 6일차- JAVA 메스드 (0) 2021.04.08 5일차-JAVA 제어문 (Boolean, 조건문, 반복문) (0) 2021.04.07 4일차-나의 앱 만들기(수강완료!!) (0) 2021.04.06