객체지향론
자바는 객체지향 언어이다.
처음에는 절차 언어로써 절차를 작성하다. 각 필요한 내용들로 구조화해서 프로그래밍으로 코드를 작성하다 보니 어느 순간 한계가 발생합니다.
그 한계란 함수의 개수가 많아져서 함수를 정리할 수 있는 방식이 필요로 했습니다.
그렇다면 어떻게 정리를 해야 할까요?
어떤 기준으로 많은 함수들을 수납할 건지의 대한 고민을 하게 되었습니다
그럼 수납하기 위해 클래스라는 파일에 함수를 정리하도록 하는데 어떠한 기준으로 함수들을 그룹핑해야 하는지에 대해 고민이 생기게 됩니다
1. 함수의 기능이 비슷한 것들끼리 묶는다.
Input이라는 클래스 파일에 입력이라는 공통분모를 가지고 있는 함수들을 수납합니다.
그럼 문제가 없을까요?
함수들은 개별적인 구조 데이터를 매개 변수로 받아 사용하고 있습니다.
그리고 함수 내의 지역변수로써 기능을 구현하고 있죠.
만약 함수들이 사용하고 있는 멤버 변수를 상관하지 않고 비슷한 기능에 따라 그룹핑을 하게 된다면 만약 참조하고 있는 멤버 변수가 변경되었을 경우 커다란 문제가 발생합니다. 수많은 오류를 어떤 함수에서 발생했는지 어떻게 찾을 것이며 어디서부터 수정해나가야 할지 막막해집니다.
자바에서 함수를 사용하는 이유 중 하나는 함수는 외부의 수정에 절대로 영향을 받아서는 안됩니다. 함수의 독립성에 문제가 생기기 때문이죠.
그렇다면 해결방법은 무엇일까요?
2. 데이터를 위주로 함수들을 수납하는 방법입니다.
클래스의 멤버 변수를 사용하는 메서드들을 그룹핑해서 하나의 클래스에 보관하게 된다면 클래스의 데이터 변경에 따른 오류를 하나의 그룹 된 곳으로 한정시킬 수 있으며
외부에서 영향을 받지 않습니다.
3. 데이터를 기준으로 메서드를 담았다면 메서드에 접근을 해야 한다.
보통 구조적인 프로그래밍에서 우리는 다른 클래스에 있는 메서드를 사용하게 될 때
구조화된 데이터를 객체로 만든 뒤. 그 객체를 메서드의 매개변수로써 넣어주어
그 데이터를 사용한 기능을 구현했습니다.
예를 들어 이렇게 말이죠
클래스 이름. 함수 이름(객체);
우리는 말을 할 때 동사가 나오고 명사가 나오지 않습니다.
우리가 함수를 데이터를 기준으로 수납하는 것은 우리의 실세계를 반영시켜 우리에 사고에 비슷하도록 코드를 작성하겠다는 의미입니다.
객체지향 프로그래밍은 구조적인 프로그래밍이 사용하는 방식과 달리 표현할 때 주객을 전도시키겠다는 이야기입니다
객체. 함수 이름;
명사야 동사해줘 라는 식입니다.
구조의 변경도 함수의 정의도 객체가 전부 책임지고 이끌어가는 것이죠.
차이점이 보이시나요?
여기서 this라는 키워드는 객체, 자기 자신을 의미합니다
main클래스의 객체를 의미하죠
그리고 또 Exam06를 의 구조화된 데이터를 보시면 static이라는 말이 빠져있습니다.
●Static이란?
가볍게 말하자면 static키워드를 쓰면 객체를 생성하지 않고도 변수나 함수를 사용할 수 있습니다.
붙이지 않는다면? 객체를 생성하고 변수나 함수를 사용하는 것입니다.
자세히 알아보겠습니다.
1. 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야 하는 것에 static을 붙입니다.
- 인스턴스(객체)를 생성하면,
각 인스턴스들은 서로 독립적(주소가 다름)이기 때문에 서로 다른 값을 유지합니다. 경우에 따라서는 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙입니다. (싱글턴을 추가로 공부하면 좋습니다)
2. static이 붙은 멤버 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- static이 붙은 멤버변수는 프로그램이 실행될 때 메모리에 이미 자동적으로 생성되기 때문입니다
3. static이 붙은 메서드에서는 인스턴스 변수를 사용할 수 없다.
- static이 붙은 메서드는 인스턴스 생성 없이 호출 가능한 반면,
인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에 static이 붙은 메서드를 호출할 때 인스턴스의 생성이 불확실해서
static이 붙은 메서드에서 인스턴스 변수 사용을 허용하지 않는다. 반대로, 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다.
인스턴스 변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.
오류 내용 Cannot make a static reference to the non-static field 변수
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 , static을 붙이는 것을 고려한다.
- 메서드의 작업내용 중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다. 왜냐하면 인스턴스 변수를 생성하지 않았기 때문이고 반대로 인스턴스 변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다 메서드 호출시간이 짧아지기 때문에 효율이 높아진다. static을 안 붙인 메서드는 실행 시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.
5. 클래스 설계 시 static사용방법
-먼저 클래스의 멤버 변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 있다면 static키워드를 붙여준다.
-작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려한다.
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
에이콘 아카데미 JAVA 복습 2주차 정리 -1 (0) | 2020.03.15 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 13일차 -26 (0) | 2020.03.13 |
자바기반의 웹&앱 응용 SW개발자 양성과정 12일차 -24 (0) | 2020.03.12 |
자바기반의 웹&앱 응용 SW개발자 양성과정 12일차 -23 (0) | 2020.03.12 |
자바기반의 웹&앱 응용 SW개발자 양성과정 11일차 -22 (0) | 2020.03.11 |
댓글