일단 시작하기 전에 감성을 좀 팔아보려 한다.
맨날 컴퓨터 앞에만 있어서 감성을 팔 시간이 없다. 지금 한 주의 코스가 끝나는 금요일 저녁을 급히 먹고 이 타이엘 쓰고 싶어서 호다다닥 스벅으로 달려와서 더운 여름에 뜨아를 시켜놓고 천천히 호호 불며 바깥 1분마다 센치하게 보고 맥북 켜놓고 있다. 훗
아무튼!
이번 주도 여윽시 주어진 과제를 다 마무리 못했는데 오늘 해보려 한다. 그전에 앞서 항상 헷갈리던 개념들이 오늘은 비유를 넣어 좀 정리해보려 한다. 지그윽히 개인적인 것이니 아마 내가 훗날 다시 더 공부하고 비교해보려 올 것 같다.
나만의 자바 용어 정리
1. 클래스 (Class)
정의
클래스(class)
자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.
자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.
클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.
출처 TCPschool
공식문서인 오라클을 아무리 참조하려 해도 정말 형이상학적으로 설명해놓았고 게다가 영어다... 뭔가 정확히 짚어내는 게 아니라서 초보인 내가 더 헷갈렸다. 그래서 그나마 알기 쉽게 정의 내린 것을 가져왔다.
우선 자바에서는 클래스가 있는데 이것 하나당 하나의 페이지가 만들어진다. 그만큼 단위 하나의 큰 개념이라고 보면 될 것 같다. 그럼 클래스란 무엇인가? 내가 정의 내린 바로는 앞으로 나올 객체를 생성하고 그리고 메소드를 정의 내리기 위한 하나의 큰 틀(유형,분류 영어로 class)이다. 다른 블로그에서는 사람으로 많이 비유를 하는데
클래스 = 사람
각 개별의 이름(실체)을 진 철수, 영의 = 인스턴스, 객체
로 비유를 많이 한다.
즉 사람은 포유류이며 지능이 발달해있고 그럼에 따라 두 손을 자유롭게 쓰고 이족보행을 하는 동물이라고 개념과 성질 정의를 내려놓는다면 이 정의들이 클래스에 해당하고
철수, 영희는 그러한 사람(클래스)의 특징을 가진 하나의 실체(실질적 존재, 보고 만질 수 있는)이다.
즉 철수, 영희는 같은 사람으로서 공통적인 특징을 공유하지만 완전히 동일한 것은 아니다. 서로 다른 객체이고 다른 성질(식습관이나 키, 성격 등)을 가질 수 있다. 하지만 두 존재 모두 사람인 것은 같다.
말이 길었는데 즉 클래스는 우리가 프로그램을 짜기 위해 직접 사용하고 쓰기 위한 객체를 선언해주기 위해 필요한 큰 개념, 틀이다.
Account account = new Account();
-------- ------- ---- ----------
1 2 3
1. 클래스명
2. 객체명(인스턴스)
3. 생성하는 객체에 넣어주는 성질을 정의해주는 메소드 (생성자라고 도함)
따라서 위 식은
Account 타입의 클래스를 가진 account라는 객체를 만든다(new) Account() 성질을 가진 채로 라고 해석하면 되겠다.
그럼 왜 저런 식으로 헷갈리게 쓰나?
처음에 쉽게 이해가 되지 않는 이유는 위 때문이라고 생각한다. 아니 왜? 그냥 변하는 모든 값은 변수라 칭하고 그것을 얹는 페이지는 그냥 뭐 클래스 이렇게 2개만 있으면 간단하지 않은가? 변수는 그냥 여기여기 대입해서 연결하면 편하고?
근데 자바가 객체 지향 언어라서 그렇다고 한다.
휴 진짜 알게 많다.. 객체지향 언어란.. 무엇이냐..?
객체 지향 언어란?
컴퓨터 프로그래밍의 한 가지 기법으로 객체를 만들고 객체를 사용하는 프로그래밍 방법을 말한다고 볼 수 있습니다.
다시 말해서 프로그램을 그저 데이터와 처리방법으로 나누는 게 아니고, 프로그램을 다수의 "객체"를 만들고, 이들이 서로 상호작용을 통해 만들어지는 방식이다. 따라서 객체의 상호작용으로 관계가 만들어지고 관리하기 때문에 유지보수가 쉽다. 내가 생성해놓은 객체를 찾아가 고치고 수정하거나 하면 된다. 컴퓨터를 예로 들면 컴퓨터(프로그램에 해당)를 구성하기 위해서 마우스, 키보드, CPU, 하드디스크, SSD, RAM 여러 부품을 조합하면 되는데 고장이나도 고장 난 부품만 갈아 끼우면 된다. 이때 부품이 각 객체에 해당된다고 생각하면 쉽다.
다시 돌아와서 따라서 클래스는 생성하기 위한 객체들의 특징을 정의 내리고 그것을 선언함으로써 다른 클래스 페이지에서 본인의 클래스의 객체를 쓸 수 있도록 해준다.
2. 객체(인스턴스 Instance)
정의
개념 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체 즉, 객체를 소프트웨어에 실체화하면 그것을 ‘인스턴스’라고 부른다. 실체화된 인스턴스는 메모리에 할당된다.
우리가 실제로 클래스를 선언하고 그것을 쓰기 위해서는 객체를 만들어야 한다. 단순히 어떤 개념(클래스에 해당)으로는 사용을 할 수 없기 때문에 그러한 개념을 구체화 놓은 대상이 필요한데 이게 객체이다. 예를 들면 클래스는 액체를 담는 어떤 것이라는 개념을 가진다면 그것이 생성하는 객체는 컵이 될 수도 머그컵도 물컵도 될 수 있는데 이렇게 실제로 사용할 수 있는 것들이 객체이다.
따라서 아래와 같이 선언하고 생성해 줄 수 있고 생성자의 매개변수에 특정 타입(여기선 물)을 입력함으로써 특정 타입만을 담는 클래스의 객체를 만들 수 도 있다. 그리고 이것을 하나의 개별적인 변수처럼 사용할 수 있다.
(액체를 담는 용기) (컵) = new (액체를 담는 용기)()
(액체를 담는 용기) (물컵) = new (액체를 담는 용기)(물)
3. 생성자(Constructor)
정의
생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
클래스로부터 객체를 생성할 때 수행되어 객체의 초기화를 담당하는 것
말이 어렵다.. 인스턴스가 생성될 때 초기화..?최대한 나 같은 초보도 보고 알 수 있게 쓰는 게 목적이므로 말하자면객체를 생성할 때 객체의 성질을 지정해주고 생성해주는 것.아까 물컵 이야기를 다시 하자면클래스 = 액체를 담을 수 있는 용기객체 = 액체를 담는 특정 용기생성자 = 어떤 액체를 담을지 혹은 그냥 액체 일지 구체적으로 정해주면서 객체를 만들어 줄 수 있음
이걸 다시 코드로 비슷하게 짜 보면containerForLiquid wineGlass = new containerForLiquid();
containerForLiquid wineGlass = new containerForLiquid(wine);
이런 식으로 선언하고 생성해 줄 수 있다.
생성자( containerForLiquid() )를 그냥 기본 값으로 써줄 수 도 있고 와인이란 것을 다른 곳에서 변수로 받아 온다면 생성자 옆 매개변수 자리에 와이을 써서 특정 지을 수 도 있다. ( 생성자 옆 괄호에 넣는 변수를 매개 변수라 고한다. 첨엔 저게 생성자인 줄 알았다. 저 공간을 옵션 엔터 치면 맨날 생성자 만들래라고 나와서)
생성자는 객체를 만들 때마다 여러 개를 지정해줄 수도 있고 헷갈리는 이유는 클래스를 만들 때 따로 정의해주지 않으면 위처럼 괄호가 빈 기본 생성자가 잡히기 때문이다. 그리고 항상 객체와 클래스명을 비슷하게 쓰기 때문에 생성자까지 나오면 더 헷갈린다...
거래내역 만들 당시..
Transaction transaction = new Transaction(); -> 이게 뭐하는 짓인가 했다...
또한 생성자는 클래스명을 이름으로 가지는 메소드라고 생각해도 편하다.
실제로 매소드처럼 괄호 안에 들어온 매개변수를 가지고 동작을 하기도 한다.
4. 메소드(Method)
정의
메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.
출처 TCPschool
자바를 배우면 그나마 가장 쉽게 와닿는 개념이 메소드인데 이것이 그나마 변수를 가지고 어떤 계산을 해내는 함수 역할을 함으로써 처리 기능을 가진 도구라고 쉽게 와닿기 때문이다. 자바에는 기본 메소드가 있는데 이를 조합해서 우리가 메소드를 만들 수 있다. 이게 상당히 재밌는 개념이었다.
우리가 태어나면 동작의 옵션은 많지 않다 이것을 기본 매소드라고 보자. 예를 들면 팔을 뻗다. 앞뒤로 움직이다. 좌우로 움직이다. 다리도 마찬가지. 하지만 이 동작들을 구체적인 방식으로 합하면 우리가 소위 부르는 기술이라는 것들이 나온다.
테니스의 백핸드 스매시 => 팔을 뒤로 돌린다. 공이 오는 타이밍을 기다린다. 공을 보낼 방향을 정한다. 라켓을 쥔 손 각도를 조정한다. 타이밍에 맞춰 세게 휘두른다.
처럼 모든 동작들은 단순 동작들의 구체적 실행방법의 집합이다.
주먹을 빠르게 내지르면서 상대방 얼굴을 향한다면 그것을 잽이라고 부르고 앞다리가 나오고 뒷다리가 지면을 박차는 행위는 달리기라고 부르듯 말이다.
이러한 메소드는 기본 메소들이나 연산자 등을 통해서 우리가 시킨 특정 명령들을 처리할 수 있는 기능을 가졌다. 또한 각 클래스에서 선언된 매소드마다 가진 매소드의 특징 다르며 중복된 이름을 가질 수 있다.( 중복 가능! 이게 중요!)
같은 클래스 안에서는
메소드명() 형태로 쓰나 자바는 다른 클래스를 엄청 넘나듦으로 보통
클래스명.메소드명(매개변수) 형태로 많이 쓰는 것 같다.
'위 클래스에서 받아온 매소드를 집어넣은 매개변수를 넣어 처리하도록 해' 정도로 해석하면 되겠다. 예를 마지막으로 들면
SojuBar sojuBar = new SojuBar(Jinro);
sojuBar.pour(JinroTonic);
위 코드처럼 일단 소주바라는 클래스를 선언하고 진로라는 매개변수를 받는 생성자로 소주 바라는 객체를 만들어준다.
자 그럼 소주바 운영하는 법이라는 특징(클래스)을 가진 진짜 소주바(객체)가 하나 만들어졌다.
이제 여기서 진로라는 소주를 가지고 무얼 하나보다. 그리고 그것을 처리해서 소주바는 진로 토닉이라는 변수를 다시 받아서 pour라는 메서드를 실행한다. 아마도 따르다 정도라는 명령어가 되겠지. 그리고 아마도 pour라는 매소드에는
public liquid pour() {
팔을뻣어잡다(소주병) -> 쥔 팔을 든다 -> 눈앞의 사람 잔이 비었는가? -> 그렇다면 따르어라
}
정도의 명령어의 집합이 있을 수 도 있다.
5. 필드화
휴 드디어... 마지막 아는걸 다시 정리하고 짜내느것도 너무 힘들군
정의
필드(field)란 클래스를 구성하는 요소 중 하나로 클래스 내부 멤버이다. 어떠한 데이터를 저장하기 위한 역할을 담당하며
클래스 내부의 생성자와 메소드 밖에 정의가 된다. 필드는 클래스에서 내부 멤버이기 때문에 멤버 변수(member variable)라고도 불리며, 클래스 내 전역에서 사용하기 때문에 전역 변수라고도 불리며 데이터를 저장하기 위한 역할을 담당하며 생성자와
메소드 밖에서 사용한다. 즉 필드란 클래스 안에서 독립적으로 선언되는 변수를 뜻한다.
출처 해쉬 넷
필드의 경우 다른 지역변수들과 다르게 초기화를 하지 않아도 기본값이 자동으로 초기화된다는 특징을 가지고 있다. String의 경우 null, int의 경우 0으로 초기화된다. 그리고 해당 클래스 내의 모든 메소드에 접근이 가능하다. 생성의 경우 객체가 생성될 때 함께 생성되며, 생성된 객체를 더 이상 참조하지 않을 때 가비지 컬렉터(Garbage Collector)에 의해서 제거된다.
필드를 선언할 때는 접근 지정자, 필드의 타입, 필드의 이름 세 가지를 정해줘야 한다. 접근 지정자에는 public과 private가 있으며, public은 모든 클래스로부터 접근 가능, private는 클래스 내부에서만 접근이 가능하며 이 외에는 접근이 불가능하다.
필드가 가장 표현하기 어려웠다고 해야 하나? 가장 마지막에 이해된 개념이기도 하고 아직 완벽하지 않기도 하다.
많은 변수들을 필드화를 시켰는데 일단 필드화를 시킨 경우는 거의다
다른 클래스에서 넘어온 변수를 해당 클래스에서 받아서 쓸 때
였던 것 같다. 따라서 필드는 항상 this.변수명 = 매개변수명 이런 형태를 자주 봤었다. 헷갈렸던 이유는 그냥 같은 값을 나타내는 목적이면 하나의 변수만 쓰면 된다고 생각했는데 그렇지 않았다. 클래스를 넘나들 때는 일단 하나의 클래스에서 쓰인 변수(그게 지역변수이든 뭐든)를 필드화를 시켜서 전역 변수(필드 변수를 전역 변수 즉 클래스 내부 전체에서 쓸 수 있는 변수라고도 하고 멤버 변수라고도 함)화 시켜야 한다. 그리고 그것을 다시 다른 클래스로 받아올 때 그냥 받아오면 안 되고 필드화 시켜서 this.variable = variable (이 페이지 변숫값에 거기 입력된 변수를 넣어줘) 통용해서 써야 한다. 왜 이런 줄 몰랐는데 이렇게 하는 게 적응되면 이렇게 하는 게 변수의 관리에 편하다.
모든 변수를 하나로 퉁친다는 말은 하나를 바꾸면 전부가 바뀐다는 말과 같다. 이는 객체 지향성에 위배될뿐더러 프로그램의 유지 보수도 더욱 어렵게 만든다.
또한 필드는 뒤에 초기 변숫값을 지정해주지 않아서 더 특이해서 잘 안 외워지는데 이는 매번 값을 초기화해서 쓰기 때문에 클래스 전역에서 사용이 가능하고 값 지정을 안 해줘도 된다고 한다.(필드는 그냥 보라색 ㅎ이라고... 죄송합니다) 그리고 이는 변수뿐 아니라 클래스와 객체 선언도 필드화 할 수 있다! 그러면 매번 PageGenerator pageGenerator = new PageGenerator(); 이렇게 안 해도 되고
클래스 밑에 PageGenerator pageGenerator; 선언한 후 다음번에
pageGenerator = new Pagenerator();
pageGenerator = new AccountPageGenerator();
위처럼 짧게 쓸 수 있다. 아마 같은 클래스 상속받는 자식 클래스를 선언할 때 편한 듯하다..
이상 평소 한참 헷갈리던 개념들을 정의해보았다.
다음번엔 아마도
Static , List <> , Array , 배열 일 것 같다.
항상 헷갈렸는데 시간이 없어서 정리를 못했는데 그래도 시간을 내서 정리하지 않을까 싶다.
마지막으로....
티아이엘이라고 써놓고 지식만 잔뜩 늘어놓은 것 같은데 위는 내가 배운 행동을 했다는 사실과 배운 것이 있다. 항상 암기가 이해의 바탕이다라고 생각하며 몰라도 외우듯 공부하면서 많이 답답했는데 정말 점점 그 개념이 다양한 상황에서 쓰이는 것들이 익숙해지고 보이자 역할이 보인다. 그리고 새롭다. 그리고 응용이 가능해진다. 며칠 전 강의 순서를 어기고 머릿속 개념으로만 따라하닥 프로그램 하나를 통째로 말아먹어서 졸음이랑 싸우며 2시간을 넣고 그래도 답답해서 다시 침대에서 누워서 30분 다시 아침 일어나자마자 1시간을 싸웠는데 그냥 삭제하고 처음부터 다시 강의 순서대로 작성해버렸다. 풀려서 일단 좋았는데 스스로에게 답답하고 화나고 자바한테도 짜증이 났다 잔뜩. 그렇게 다시 또 강의를 보면서 저건 왜 저럴까 생각하고 모르면 개념을 잘 아는 동료에게 꾸역꾸역 붙잡고 물어보고 다시 또 캐물어보고 직접 모르거나 궁금하면 코드를 처봤다.
'왜 이렇게 처리하면 안되지? 왜 메소드로 값을 반환하지? 변수론 안돼? 대체 필드화를 왜 시켜? 아니 그냥 이동 안돼? 아니 왜오애왜오애ㅗㅇ왱!!' 하다 보니 조금 풀린다. 휴 정말 저 4개의 개념을 완벽히도 아니고 어렴풋 여기까지 정리하는데 시간이 걸렸다. 그래도 훗날 이 블로그 보는 의미가 있겠지!
무언가 어렴풋이 나만의 개념이 정리되고 정의가 선다는 것. 그것이 완벽하진 않아도 학습의 시작이라고 생각한다.
내가 주짓수를 1년쯤 배울 때쯤 그랬고 지금도 여전히 부족하지만 그때 세운 개념의 확장일 뿐 전혀 새로운 지식을 쌓은 것이 아니다.
지금 쌓은 개념을 더 조금씩 보완하고 수정하고 마치 하나의 프로그램을 완성하듯 완성해보자 :)
자바..... 너를 잡아...
...
...
'개발공부하며 느낀 인생 공부' 카테고리의 다른 글
코딩을 배우면서 느낀 나의 심경변화[220627 TIL] (0) | 2022.06.27 |
---|---|
Give it your all 그리고 OKR 을 살짝 곁들인..[메가테라 7주차 주간회고] (0) | 2022.06.24 |
지루함, 어려움을 극복하는 법들 (0) | 2022.06.24 |
우리는 왜 다 끝내지 못하는가?[220623 TIL] (0) | 2022.06.23 |
자바 배열의 선언과 초기화[220622 TIL] (0) | 2022.06.23 |
댓글