Chapter 03 안드로이드를 위한 Java 문법

Ruinak·2021년 7월 31일
0

Android

목록 보기
3/15
post-thumbnail

1. Java의 개요

1-1 Java의 특징

  1. 구문이 간결하다.
    • C++에 비해 불필요한 부분이 없어 간단하게 구성되어 있습니다.
    • 포인터 데이터 형식을 없앰으로써 C++에서 주로 문제를 일으키던 메모리 관리 문제가 대폭 해결되었습니다.
  2. 명료한 객체지향 언어이다.
    • Object 클래스에서 모든 클래스를 파생시키는데, C++와 달리 단일 클래스 상속만 사용하며 대신 인터페이스를 통해 다중 상속 문제를 해결했습니다.
    • 연산자 오버로딩(overloading)을 지원하지 않습니다.
  3. 이식성이 높으며 기계에 중립적이다.
    • 한 번 작성한 Java는 다양한 운영체제에서 동작합니다.
    • JVM(Java Virtual Machine)이라는 소프트웨어에 의해 가능합니다.
  4. 분산 처리를 지원한다.
  5. 멀티스레드(multi-thread)언어이다.

1-2 Java 프로그램 작성법

  • Java 프로그램은 전통적으로 아래와 같이 작성합니다.
  1. 메모장에서 Java 코드를 작성한 후 *.java로 저장한다.
  2. javac.exe를 사용해서 컴파일하면 *.class 파일이 생성된다.
  3. 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을 사용하면 일반적으로 사용하는 '연월일'이나 '시분초'와 같은 표현이 가능합니다.
profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글