ruinak_4127.log
로그인
ruinak_4127.log
로그인
Chapter 03 안드로이드를 위한 Java 문법
Ruinak
·
2021년 7월 31일
팔로우
0
android
0
Android
목록 보기
3/15
1. Java의 개요
1-1 Java의 특징
구문이 간결하다.
C++에 비해 불필요한 부분이 없어 간단하게 구성되어 있습니다.
포인터 데이터 형식을 없앰으로써 C++에서 주로 문제를 일으키던 메모리 관리 문제가 대폭 해결되었습니다.
명료한 객체지향 언어이다.
Object 클래스에서 모든 클래스를 파생시키는데, C++와 달리 단일 클래스 상속만 사용하며 대신 인터페이스를 통해 다중 상속 문제를 해결했습니다.
연산자 오버로딩(overloading)을 지원하지 않습니다.
이식성이 높으며 기계에 중립적이다.
한 번 작성한 Java는 다양한 운영체제에서 동작합니다.
JVM(Java Virtual Machine)이라는 소프트웨어에 의해 가능합니다.
분산 처리를 지원한다.
멀티스레드(multi-thread)언어이다.
1-2 Java 프로그램 작성법
Java 프로그램은 전통적으로 아래와 같이 작성합니다.
메모장에서 Java 코드를 작성한 후 *.java로 저장한다.
javac.exe를 사용해서 컴파일하면 *.class 파일이 생성된다.
java.exe를 사용해서 컴파일된 *.class 파일을 실행한다.
하지만 위 방법은 명령 프롬프트에서 사용해야 하고 오류가 발생할 때 디버깅도 불편하여 권장하지 않는 방법입니다.
Eclipse를 사용하면 위의 과정을 한 화면에서 처리할 수 있어 개발자들은 대부분 Eclipse 환경에서 Java를 개발합니다.
2. Java의 기본 문법
2-1 변수와 데이터 형식
다른 프로그래밍 언어와 마찬가지로 Java도 변수를 선언해서 사용해야 합니다.
예제 3-2
Java에서 많이 사용되는 기본적인 데이터 형식
2-2 조건문 : if, switch( ) ~ case
if문은 조건이 true인지 false인지에 따라서 어떤 작업을 할 것인지를 결정합니다.
true와 false 중 하나로 결정되기 때문에 if문을 이중 분기라고도 부릅니다.
switch( ) ~ case문은 여러 가지 경우에 따라서 어떤 작업을 할 것인지를 결정하므로 switch( ) ~ case문을 다중 분기라고도 부릅니다.
예제 3-3
2-3 배열
배열은 여러 데이터를 한 변수에 저장하는데 사용합니다.
배열의 개념
일차원 배열을 선언하고 값을 대입하는 방법은 아래와 같습니다.
이차원 배열을 선언하고 값을 대입하는 방법은 아래와 같습니다.
배열을 선언하면서 바로 값을 대입할 수도 있습니다.
배열의 크기를 확인하려면 '배열명.length'를 사용합니다.
2-4 반복문 : for, while
반복문은 조건문과 함께 프로그래밍의 필수 요소입니다.
for문의 형식은 아래와 같습니다.
배열을 지원하는 for문의 형식은 아래와 같습니다.
위와 같이 작성하면 배열의 내용이 하나씩 변수에 대입된 후 for문 내부가 실행됩니다.
- 그러므로 결국 배열의 개수만큼 for문이 반복됩니다.
while문은 아래와 같은 형식을 사용합니다.
반복문을 빠져나오려면 break문을 사용하고, 반복문의 조건식을 건너뛰려면 continue문을 사용합니다.
예제 3-4
2-5 메소드와 전역변수, 지역변수
기본 메서드인 main( ) 메서드 외에 사용자가 메서드를 추가로 생성할 수 있습니다.
메서드를 호출할 때 파라미터를 넘길 수도 있고, 메서드에서 사용된 결과를 return문으로 돌려줄 수 있습니다.
변수에는 전역변수(global variable)와 지역변수(local variable)가 있습니다.
전역변수는 모든 메서드에서 사용되고, 지역변수는 메서드 내부에서만 사용됩니다.
예제 3-5
2-6 예외 처리 : try ~ catch
예외(exception)는 Java 프로그램 실행 중에 발생하는 오류를 말며, Java는 try ~ catch문을 통해 이 오류를 처리합니다.
try ~ catch문은 Java 프로그램을 견고하게 만드는 역할을 합니다.
예제 3-6
2-7 연산자
Java에는 여러가지 연산자가 있습니다.
아래 표는 주로 사용되는 연산자입니다.
연산자 중 캐스트 연산자는 안드로이드 프로그래밍에서 클래스형 데이터의 강제 형식 변환에도 상당히 많이 사용됩니다.
- 예로 아래는 View 클래스형을 Botton형으로 변환하는 코드 입니다.
button = (Button) findViewById(R.id.btn);
3. 클래스와 인스턴스
객체지향 프로그래밍(Object-Oriented Programmin, OOP)은 Java, C++, C# 등에서 사용되는 프로그래밍 기술입니다.
Java는 객체지향 언어이므로 객체지향을 이해하지 못하면 안드로이드 프로그래밍이 어렵게 느껴질 수 밖에 없습니다.
3-1 클래스 정의와 인스턴스 생성
클래스(class)는 변수(필드)와 메서드로 구성됩니다.
객체지향 관점에서는 클래스를 실세계의 객체가 가질 수 있는 상태와 행동을 정의할 수 있습니다.
예제 3-7
예제 3-8
3-2 생성자
인스턴스를 생성하고 해야 할 일을 클래스 안의 생성자로 미리 만들어놓을 수 있습니다.
메서드를 생성하면서 파라미터를 넘기면 데이터가 생성자로 넘어갑니다.
생성자는 클래스의 이름과 동일하게 하고, 메서드의 데이터 형식은 생략합니다.
예제 3-9
Car 클래스에 생성자 추가
예제 3-10
예제 3-9에서 생성한 생성자에 맞게 수정해줍니다.
3-3 메서드 오버로딩
메서드 오버로딩은 클래스 내에서 메서드의 이름이 같아도 파라미터의 개수나 데이터형만 다르면 여러 개를 선언할 수 있는 것을 말합니다.
예제 3-11
3-4 정적필드, 정적 메서드, 상수 필드
클래스를 인스턴스로 생성한 후에 필드(변수)를 사용하려면 선언을 해야합니다.
인스턴스를 생성하지 않고 클래스 자체에서 사용되는 변수가 필요할 수도 있는데 이러한 필드를 정적 필드(static field)라고 합니다.
정적 필드를 만들려면 변수 앞에 static 키워드를 붙입니다.
메서드 앞에 static 키워드를 붙이면 정적 메서드(static method)가 되는데, 정적 메서드는 인스턴스 없이 '클래스명.메소드명( )'으로 호출하여 사용할 수 있습니다.
상수 필드는 정적 필드에 초깃값을 입력하고 final을 앞에 붙이면 됩니다.
상수 필드는 대문자로 구성하는 것이 일반적이며, 클래스 안에 상수를 정의할 때 사용합니다.
예제 3-12
예제 3-13
4. 클래스 상속
4-1 클래스 상속과 메서드 오버라이딩
클래스 상속(inheritance)은 기존 클래스가 가지고 있는 것을 그대로 물려받으면서 필요한 메서드를 추가로 정의하는 것을 말합니다.
서브클래스는 슈퍼클래스의 모든 필드와 메서드를 상속받으므로 별도의 선언이나 정의 없이도 슈퍼클래스의 필드와 메서드를 사용할 수 있습니다.
예제 3-14
예제 3-15
4-2 추상 클래스와 추상 메서드
추상(abstract) 클래스는 인스턴스를 금지하는 클래스를 말합니다.
여기서 인스턴스화는 클래스로 인스턴스를 생성하는 것을 의미합니다.
추상 클래스는 클래스 앞에 abstracr 키워드를 붙여서 지정합니다.
추상 메서드는 메서드 본체가 없는 메서드로, 추상 클래스와 마찬가지로 메서드 앞에 abstract 키워드를 붙여서 지정합니다.
추상 메서드를 포함하는 클래스는 추상 클래스로 지정해야합니다.
추상 클래스와 추상 메서드를 사용하는 목적은 공통으로 사용되는 기능을 추상 메서드로 선언해 놓고 추상 클래스를 상속받은 후에 반드시 추상 메서드를 오버라이딩해서 사용하기 위함입니다.
추상 메서드를 오버라이딩하는 것을 추상 메서드를 '구현한다(implement)'고 합니다.
예제 3-16
예제 3-17
예제 3-18
예제 3-19
4-3 클래스 변수의 다형성
다형성(polymorphism)은 자신의 서브클래스에서 생성한 인스턴스도 클래스 변수에 댕비할 수 있는 것을 말합니다.
클래스 변수의 다형성을 이용하면 하나의 변수에 여러 종류의 인스턴스를 대입할 수 있습니다.
예제 3-20
4-4 인터페이스와 다중 상속
인터페이스는 추상 클래스와 그 성격이 비슷합니다.
인터페이스는 class 키워드 대신 interface 키워드를 사용하여 정의하고, 내부에는 추상 메서드를 선언합니다.
클래스에서 인터페이스를 받아 오나성할 떄 extends 키워드 대신 implements 키워드를 사용해야 합니다.
- 그러므로 인터페이스를 '상속받는다'고 하지 않고 '구현한다'고 합니다.
Java는 다중 상속을 지원하지 않는 대신, 인터페이스를 사용하여 다중 상속과 비슷하게 작성할 수 있습니다.
예제 3-21
4-5 익명 내부 클래스
익명 내부 클래스(anonymous inner class)는 '이름이 없는' 내부 클래스를 말합니다.
주로 한 번만 사용하고 버려지는 클래스에 사용됩니다.
안드로이드 프로그래밍에서 익명 내부 클래스를 상당히 많이 사용하게 됩니다.
- 버튼 등을 클릭했을 때 발생하는 이벤트의 인터페이스 리스너(listener)를 생성할 때 주로 사용합니다.
예제 3-22
5. 추가로 알아둘 Java 문법
5-1 패키지
클래스와 인터페이스가 많아지면 어렵기 때문에 패키지 단위로 묶어서 관리합니다.
안드로이드 프로그래밍을 할 때는 처음 프로젝트의 패키지를 지정하는 것 외에 패키지를 생성하는 일이 드물지만, 기존에 JDK 또는 안드로이드 SDK에서 제공되는 클래스나 인터페이스가 패키지로 묶여서 제공되므로 개념을 파악할 필요는 있습니다.
사용자가 생성한 클래스가 포함될 패키지는 *.java 파일 첫 행에 다음과 같이 지정합니다.
http://developer.android.com/reference에
접속하면 안드로이드에서 제공되는 클래스 및 인터페이스가 패키지에 묶여있는 것을 확인할 수 있습니다.
5-2 제네릭스
제네릭스(Generics)는 데이터 형식의 안정성을 보장하는데 사용합니다.
아래 코드는 배열 리스트 strList에 문자, 숫자 등 무엇이든 넣을 수 있습니다.
위와 같은 경우에 컴파일러에서는 문제가 발생하지 않지만, 마지막 행과 같이 실수로 숫자를 넣으면 문제가 발생할 소지가 있습니다.
아래 코드처럼 제네릭스를 사용하여 strList에는 문자열만 들어가도록 설정할 수 있습니다.
제네릭스는 <String>뿐만 아니라 <Integer>, <Double> 등을 사용할 수 있고 사용자가 정의한 클래스형에도 사용할 수 있습니다.
5-3 데이터 형식 변환, 문자열 비교, 날짜 형식
데이터 형식 변환
데이터 형식 변환을 위해 캐스팅 연산자 대신 Java에서 제공하는 클래스의 정적 메서드를 사용할 수도 있습니다.
문자열 비교
문장열을 비교하려면 String 클래스의 equals( ) 메서드를 사용하는 것이 좋습니다.
날짜 형식
날짜를 표현할 때 DateFormat 클래스를 사용할 수도 있지만, 이를 상속받은 SimpleFormat을 사용하면 일반적으로 사용하는 '연월일'이나 '시분초'와 같은 표현이 가능합니다.
Ruinak
Nil Desperandum <절대 절망하지 마라>
팔로우
이전 포스트
Chapter 02 처음 만드는 안드로이드 애플리케이션
다음 포스트
RecyclerView Common Code
0개의 댓글
댓글 작성