본문 바로가기

모바일/안드로이드

안드로이드를 위한 자바문법 -2-


안녕하세요.

오늘은 안드로이드를 위한 자바문법의 두번째입니다.

원래 이번에 끝내려고 했는데 생각해보니 목차가 9개가 넘어가 버릴 것 같아서

자바문법은 3장까지 진행하겠습니다.


어제 쓴 1장을 읽어봤는데 내용이 너무 부실하네요.

다시 한번 말씀드리지만 자바 서적 하나를 읽어보시는걸 추천합니다.

그림으로 배우는 자바프로그래밍 -> 어려울 수 있는 객체지향언어를 그림으로 풀어나가는 교재

열혈강의 자바 -> 무료로 온라인 강의를 제공하므로 독학이 어려운 사람들에게 어울리는 교재


아무래도 프로그래밍이 처음이신분들은 제 포스팅만 보고 따라하기에는

큰 무리가 있을듯 싶어요.


목차

1. 메소드와 변수의 범위

2. 예외 처리

3. 연산자와 캐스팅

4. 클래스와 인스턴스

5. 정적 필드, 정적 메소드, 상수 필드


1. 메소드와 변수의 범위

자바에서 프로그램이 실행될 때 기본적으로 실행되는 메소드인 main() 함수 외에

개발자가 추가로 메소드를 구현할 수 있습니다.


이전장에서 설명드린 변수는 보통 사용 범위에 따라 전역변수와 지역변수라는

두 가지 종류로 나뉩니다.


전역변수는 프로그램에 정의된 모든 메소드에서 사용 가능하며

자바에서는 보통 멤버변수라고 합니다.(클래스 안에 선언하는 변수)


지역변수는 {} 블럭에 한정되어 메소드 내에서만 사용 가능합니다.


멤버변수와 지역변수로 var라는 같은 변수이름을 사용했지만

실제 메소드에서 출력할 때는 메소드 내부에 있는 지역변수가 우선시 되므로

콘솔에는 0이 출력됩니다.


이후에 새로 정의한 함수 addTwoInt()의 파라미터로 10과 20을 넘긴 뒤

멤버변수 var와 인자로 받은 두 수의 합을 구해서 sum이라는 정수형 변수에 저장한 뒤

sum을 반환합니다.두번째 출력 결과는 130이 됩니다.


static키워드는 정적 필드나 정적 메소드를 위한 키워드인데, 클래스에 대한 설명 이후에 알아보겠습니다.


지역변수는 메소드 내부에서만 사용한다고 했습니다.

addTwoInt() 함수를 호출했을 때 sum이라는 지역변수가 생성되고,

함수의 기능이 종료되고 사용하지 않는 메모리가 되어

가비지 컬렉터라는 녀석이 추후에 메모리에서 지워줍니다.


2. 예외 처리

자바에서 프로그램 실행 중에 발생하는 오류를 예외(Exception)이라고 합니다.

예외가 발생하면 프로그램에 문제가 생기므로

우리는 이러한 예외를 일일히 처리해줘야합니다.


try ~catch문을 통해 이러한 오류를 처리할 수 있습니다.

트라이 캐치문을 통해 다양한 오류를 제어하여 프로그램을 견고하게 만들어 줄 수 있습니다.


 


두개의 정수형 변수를 선언하고 각각 100과 0을 대입했습니다.

콘솔에 100을 0으로 나눈 값을 출력해야 하는데

100을 0으로 나눌 수 없으므로 예외가 발생합니다.


이와같이 수학적, 계산적으로 발생한 오류는

java.lang.ArithmeticException 객체로 취급합니다.


그림을 보시면 try와 catch, finally 각각의 용도를 확인하실 수 있습니다.


3. 연산자와 캐스팅

연산자는 어떠한 기능을 수행하기 위한 기호를 의미합니다.

어떠한 기능은 보통 연산을 뜻하며 데이터의 처리를 의미합니다.


 

굳이 프로그래밍이 아니여도 엑셀을 다뤄보신 분들이라면

눈에 익으신 연산자도 있을겁니다.


연산자는 프로그래밍을 하다보면 자연스럽게 외우게 됩니다.

다만 처음 개발을 하시는 분들은 다소 어려울 수 있으니 직접 하나씩

예제를 만들어서 실행해보시는 것이 좋겠습니다.


위의 연산자 중 캐스트 연산자는 우리가 안드로이드 프로그래밍에서

xml에서 선언한 위젯의 id를 읽어올 때 자주 사용합니다.

btn1 = (Button) findViewById(R.id.btn1);

여기서 findViewById는 이전에 설명드렸듯이 부모클래스인 View를 리턴하므로

Button클래스로 강제 형변환을 합니다.


4. 클래스와 인스턴스

OOP(Object_Oriented Programming)는 객체지향 프로그래밍의 줄임말로

자바, C++, C# 등 여러 프로그래밍언어에 사용되는 기술입니다.

자바는 객체지향언어이므로 객체지향의 이해가 필수적인 요소입니다.


 


객체

우리가 실생활에서 볼 수 있는 모든 것을 객체라고 할 수 있습니다.

지금 제가 만지고있는 키보드, 노트북, 마우스같은 사물이 될 수도 있고

인터넷, 와이파이, 물과 같이 실체가 모호한 개념도 객체가 될 수 있습니다.


검은색 아우디 자동차라는 객체가 있다고 하면

그 자동차는 모델명 : 아우디, 색상 : 검정색, 가격 : 미정 등의 속성(멤버변수)와

시동, 주행, 브레이크 등과 같은 동작(메소드)로 구성된 객체입니다.

 

클래스

클래스란 객체가 가질 수 있는 상태(멤버변수)와 행동(메소드)으로 정의할 수 있습니다.

위의 예제에서는 붕어빵이라는 현실에 있는 객체를 만들기 위한 틀이 클래스라고 했습니다.

클래스를 설계도라도 생각하시면 될 것 같습니다.

이러한 설계도인 클래스를 인스턴스화해서 객체인 붕어빵을 계속해서 찍어낼 수 있습니다.


 




인스턴스

클래스로부터 객체를 생성하는 일련의 과정을 인스턴스화라고 합니다.


클래스 -> 객체

의 관계에서 객체를 클래스의 인스턴스라고 합니다.

객체와 인스턴스가 도대체 무엇이 다른거냐는 의문이 있을 수도 있겠지만

인스턴스를 객체를 만드는 방법이라고 보면 어떨까요?

붕어빵 틀에서 붕어빵이라는 객체를 만들기 위해 재료를 넣은 뒤 붕어빵을 제조하는 과정을

인스턴스화라고 생각합니다.

보통 객체가 인스턴스의 개념을 포함하기 때문에 객체와 인스턴스의 개념은 서로 모호합니다.


사물을 직접적으로 가르키면 객체라고 하고

해당 사물의 이름을 부르면 인스턴스라고 한다고 합니다.

많은 논란이 있으므로 가급적 클래스와 인스턴스라는 용어를 사용하겠습니다.


확실한 내용을 알고싶으신 분은 아래 링크를 참고해주세요.


5. 정적 필드, 정적 메소드, 상수 필드

클래스의 필드(멤버 변수)의 값을 조작하거나 얻어오거나,

함수를 사용하고자 하는 경우 클래스를 인스턴스로 생성해야합니다.


그러나 이러한 인스턴스를 생성하지 않고 클래스 자체에서 사용되는 변수나

함수가 필요한 경우 제공되는 키워드가 static입니다.

변수나 함수를 선언할 때 static을 붙여주면(일반적으로 맨 앞) 정적 필드나 정적 메소드로 선언하여

인스턴스를 생성하지 않고도 클래스 이름으로 접근이 가능합니다.


또 상수 필드는 정적 필드를 선언할 때 초깃값을 입력하고 final 키워드를 붙여주면

상수로 선언할 수 있습니다.(값이 변하지 않음)

보통 상수 필드는 대문자로 이름을 정합니다.


 


Car라는 클래스를 선언하고

정적 필드로 carCount, 상수 필드로 MAXSPEED, MINSPEED를 선언했습니다.

일반 필드에는 속도와 색깔을 선언했습니다.


정적 메소드로 정적 필드의 값을 반환하는 함수를 선언했습니다.


그 뒤 클래스 내부의 메인 함수에서 Car클래스의 인스턴스를 생성한 뒤

Car클래스의 정적 필드인 차의 개수를 1증가 시키고

Car클래스의 인스턴스에 색깔과 속도를 대입했습니다.


속도를 대입할 때는 생성한 인스턴스가 아닌

Car클래스의 정적 필드인 최대속도와 최소속도를 이용해서 허용범위를 계산했습니다.






이상으로 안드로이드를 위한 자바문법 두번째 내용을 마치겠습니다.

아직 상속, 오버라이드 등이 남았는데 그걸 여기다 모두 포함하면

스크롤압박에 모두들 뒤로가기를 누르실 것만 같아 세번째 장까지 진행하게 되었네요.


그러고보니 대학교에서 3년동안 프로그래밍을 배우면서 자바를 2년정도 배웠는데

객체와 인스턴스에 대한 차이를 명확히 설명해주시는 교수님이 없었네요,

처음부터 지금까지 교수님들 모두 객체라는 표현을 사용하고 있어요.

이 참에 저도 확실한 차이를 알아봐야겠네요.