자바(java) 문법 정리
자바 기초 문법을 개인공부를 목적으로 정리한 글입니다.
자바의 정석 책 외의 위키독스의 “점프 투 자바”를 참고하여 작성했습니다. https://wikidocs.net/book/31
1. intro
public class StringExample {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println("굿굿");
}
}
public
: 메소드의 접근제어자, public은 누구나 이 메소드에 접근할 수 있다는 의미class
: 클래스 블록을 만드는 키워드static
: 메소드에 static 이 지정되어 있는 경우 이 메소드는 인스턴스 생성없이 실행 할 수 있음을 의미- static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다.
- 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용한다. 1
- 값을 변경해 줄 경우 클래스 이름을 앞에 씀.
void
: 메소드의 리턴값이 없음(void: 사전적으로 “텅 빈” 이라는 뜻)을 의미return
: 실행중인 메서드를 종료하고 호출한 곳으로 되돌아간다.- 반환타입이 void가 아닌 경우, 반드시 return문 필요
String[]
: 문자열을 나타내는 자바의 자료형 ([]가 있으므로 한 개가 아닌 여러개의 값으로 이루어진 배열임을 의미)args
: String[] 자료형에 대한 변수명 (arguments의 약어)- args 대신 다른 이름을 사용해도 상관없다.
System.out.println
: 표준출력으로 데이터를 보내는 자바의 내장 메소드로 println 메소드의 입력 문자열을 화면에 출력한다. (명령문; Statement)main
: 클래스를 실행할 수 있는 메소드;
: 세미콜론, 문장이 종료되었음을 의미.- 문장의 마지막에 반드시 세미콜론이 있어야 한다.
//
: 라인 주석 처리/* */
: 블록 주석 처리- 클래스명은 소스파일의 이름(클래스명.java)과 동일하게 사용해야 한다.
- 클래스 블록은 중괄호
{}
로 둘러싸여 있다.
- 클래스 블록은 중괄호
- 메소드명은 원하는 이름으로 지울 수 있다.
- 메소드 명 이후의 괄호()안의 값들은 메소드의 입력 인자를 뜻한다.
- 입력 인자는 “입력자료형” + “입력변수명” 형태로 이루어 진다.
- 메소드 블록은 중괄호
{}
로 둘러싸여 있다.
변수와 자료형
- 변수(variable) : 하나의 값을 저장하기 위한 메모리 공간
- 변수명 규칙
- 변수명은 숫자로 시작할 수 없다.
_
와$
문자 이외의 특수문자는 사용할 수 없다.- 자바의 키워드는 변수명으로 사용할 수 없다. (예:int, class, return 등)
- 상수(constant) : 한 번만 값을 저장 가능한 변수 (final)
- 리터럴(literal) : 그 자체로 값을 의미하는 것
int a;
String b;
a = 1;
b = "hello java";
- 클래스명 규칙
- 클래스명은 명사로 한다.
- 여러개의 단어가 섞이는 경우 각 단어의 첫번째 문자는 대문자이어야 한다.
- 메소드명 규칙
- 메소드명은 동사로 한다.
- 클래스명과 마찬가지로 여러 개의 단어가 섞이는 경우 각 단어의 첫번째 문자는 대문자이어야 한다. 단, 처음 시작하는 문자는 항상 소문자로 시작해야 한다.
- 변수명 규칙
- 순서를 의미하는 임시적인 정수의 변수명은 i, j, k, m, n을 사용한다.
- 변수명에 _, $ 기호를 사용할 수 있지만 시작 문자로 사용하지 않는다.
숫자
- 정수 : int, long
- 실수 : float, double
- 8진수와 16진수는 int 자료형을 사용하여 표시한다.
0
으로 시작하면 8진수,0x
로 시작하면 16진수가 된다.
- 숫자 연산 :
+
,-
,*
,/
%
: 나머지 값 출력
- 증감연산 :
++
,--
불린
- 불린(boolean) : 참 또는 거짓의 값을 갖는 자료형
true
orfalse
- 불린 연산은 조건문의 판단 기준으로 많이 사용된다.
문자
- 한 개의 문자 값에 대한 자료형은
char
를 이용- 문자값을
' '
로 감싸준다.
- 문자값을
- 문자열(문장)은
String
으로 표현 new
키워드는 객체를 만들 때 사용equals
: 문자열의 값을 비교할 때indexOf(문자)
: 문자열에서 특정 문자가 시작되는 위치(인덱스)를 리턴replaceAll(문자, 바꿀 문자)
: 문자열 중 특정 문자열을 다른 문자열로 바꾸고자 할 때 사용substring(시작위치, 끝위치)
: 문자열 중 특정 부분을 뽑아낼 경우에 사용toUpperCase
: 문자열을 모두 대문자로 변경할 때toLowerCase
: 문자열을 모두 소문자로 변경할 때
public class TestString {
public static void main(String[] args) {
String a = "Hello Java";
System.out.println(a); //Hello Java
System.out.println(a.indexOf("Java")); //6
System.out.println(a.replaceAll("Java", "World")); //Hello World
System.out.println(a.substring(0,4)); //Hell
System.out.println(a.toUpperCase()); //HELLO JAVA
}
}
StringBuffer
StringBuffer
: 문자열을 추가하거나 변경 할 때 주로 사용하는 자료형append
: 문자열 추가+=
로 문자열을 추가해 나갈 수 있음
toString()
: String 자료형으로 변경insert(위치, 넣을 문자)
: 특정 위치에 원하는 문자열을 삽입
배열 (Array)
- 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
- int 자료형의 배열은
int[]
로 표현 - String 자료형의 배열은
String[]
로 표현
리스트 (List)
리스트
는 크기가 정해져 있지 않고 동적으로 변한다는 점이다.- ArrayList는 List 자료형 중 가장 간단한 형태의 자료형이다.
- ArraryList를 사용하기 위해서
import java.util.ArrayList
를 먼저 불러온다.
- ArraryList를 사용하기 위해서
add
: 값 추가add(넣을 위치, 값)
: 넣을 위치를 지정해서 값 추가get(위치)
: 위치에 해당되는 값 가져옴size()
: ArrayList의 갯수를 리턴한다.contains(값)
: 리스트 안에 해당 값이 있는지 boolean으로 반환remove(객체)
: 리스트에서 객체에 해당되는 항목을 삭제하고 삭제한 결과(true, false)를 리턴한다.remove(인덱스)
: 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴한다.
import java.util.ArrayList;
public class Sample {
public static void main(String[] args) {
ArrayList<String> pitches = new ArrayList<String>();
pitches.add("138");
pitches.add("129");
pitches.add("142");
System.out.println(pitches.get(1)); //129
System.out.println(pitches.size()); //3
System.out.println(pitches.contains("142")); //true
System.out.println(pitches.remove("129")); //true
System.out.println(pitches.size()); //2
System.out.println(pitches.remove(0)); //138
}
}
맵 (Map)
Map
은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻는다.put(키, 값)
메소드를 통해 key와 value를 입력한다.get(키)
: key에 대응되는 value 값 출력containsKey(키)
: 해당 키가 있는지를 boolean 형태로 반환remove(키)
: 해당 키에 대응되는 아이템(key, value)을 삭제한 후 그 value 값을 반환size()
: Map의 갯수 리턴
/**
* Sample
*/
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.get("people")); //사람
System.out.println(map.containsKey("people")); //true
System.out.println(map.remove("people")); //사람
System.out.println(map.size()); //1
}
}
제어문
if문
- 조건이 true이면 if문 수행, false이면 else문 수행
if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
} else {
<수행할 문장A>
<수행할 문장B>
...
}
비교연산자 | 설명 |
---|---|
x < y |
x가 y보다 작다 |
x > y |
x가 y보다 크다 |
x == y |
x와 y가 같다 |
x != y |
x와 y가 같지 않다 |
x >= y |
x가 y보다 크거나 같다 |
x <= y |
x가 y보다 작거나 같다 |
x || y |
x와 y 둘 중 적어도 하나가 참이면 참이다 |
x && y |
x와 y 모두 참이어야 참이다 |
!x |
x가 거짓이면 참이다 |
- else if (다중 조건 판단)
if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
}else if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
} else {
<수행할 문장1>
<수행할 문장2>
...
}
switch/case 문
switch(입력변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
while 문
while (조건문) {
<수행할 문장1>
<수행할 문장2>
...
}
break
: while문 빠져 나가기continue
: while문 조건문으로 돌아가기
for 문
for (초기치; 조건문; 증가치){
...
}
break
: for문 빠져 나가기continue
: for문 조건문으로 돌아가기
- for-each 문
for (변수 : 배열레퍼런스)
반복작업문
//예시
int[] a = {1,2,3,4,5};
int sum = 0;
for (int i: a)
sum += i;
System.out.println(sum); // 15
제어자(modifier)
- 클래스와 클래스의 멤버에 부가적인 의미
- 접근 제어자 : public, protected, (default), private
- 그 외 : static, final, abstract, …
- 하나의 대상에 여러 제어자를 같이 사용 가능 (접근 제어자는 오직 하나)
static
: 클래스의, 공통적인final
: 마지막의, 변경될 수 없는abstract
: 추상의, 미완성의- 추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성 가능
- 접근 제어자(access modifier)
- private : 같은 클래스 내에서만 접근 가능
- (default) : 같은 패키지 내에서만 접근이 가능
- protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
- public : 접근 제한이 전혀 없다.
객체지향 프로그래밍
public class Animal {
}
- 클래스의 선언만 있고 내용이 없는 껍데기뿐인 클래스 (class=설계도)
- 클래스
- 설계도
- 데이터 + 함수
- 사용정의 타입 (원하는 타입을 직접 만듦)
- 객체(object)를 만드는 기능이 있다.
- 객체 : 모든 인스턴스를 대표하는 일반적 용어
- 인스턴스 : 특정 클래스로부터 생성된 객체
Animal cat = new Animal();
- cat은 Animal의
instance
이다.- 인스턴스는 특정 객체가 어떤 클래스의 객체인지를 관계위주로 설명할 때 사용된다.
- 클래스에 의해 생성되는 것은
객체
, 그 클래스에 선언된 변수는객체 변수
이다.
public class Animal {
String name;
public static void main(String[] args) {
Animal cat = new Animal(); // cat이라는 객체 생성
System.out.println(cat.name); //결과값 : null
// name은 객체 변수
}
}
메소드
- 메소드는 클래스 내에 구현된 함수를 의미.
- 문장들을 묶어놓은 것 (작업단위로 문장들을 묶어서 이름 붙인 것)
- 값(입력)을 받아서 처리하고, 결과를 반환
- 객체 변수에 값을 대입하는 방법
this
는 클래스에 의해서 생성된 객체를 지칭한다. (여기서는 this==cat)
public class Animal {
String name;
public void setName(String name) { // String name : 입력 , void : 출력 (리턴값 X)
this.name = name; // '객체.메소드'로 객체가 메소드를 호출
// setName 메소드의 입력으로 "body"와 같은 문자열을 전달해야 한다.
}
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("body"); // name에 body 문자열 전달
System.out.println(cat.name); //body
}
}
- 클래스에서 가장 중요한 부분은 객체 변수의 값이 독립적으로 유지된다는 점이다.
public class Animal {
String name;
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("body");
Animal dog = new Animal();
dog.setName("happy");
System.out.println(cat.name); //body
System.out.println(dog.name); //happy
}
}
return
: 메소드의 결과 값을 돌려주는 명령어매개변수
: 메소드에 입력으로 전달된 값을 받는 변수인수
: 메소드를 호출할 때 전달하는 입력값
public 리턴자료형 메소드명(입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
...
return 리턴값; // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}
public class Sample {
public int sum(int a, int b) { // a, b는 매개변수
return a+b;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
Sample sample = new Sample();
int c = sample.sum(a, b); // 3, 4는 인수
System.out.println(c); // 7
}
}
return
을 단독으로 써서 메소드를 즉시 빠져나가는 경우가 있다.
상속
- 자식 클래스가 부모 클래스의 기능을 그대로 물려받을 때
extends
키워드 사용
// Animal.java 파일
public class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
//Dog.java 파일
public class Dog extends Animal{
public void sleep() {
System.out.println(this.name+" zzz");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("poppy");
System.out.println(dog.name); //poppy
dog.sleep(); //poppy zzz
}
}
IS-A 관계
- 위에 보았듯이 Dog is a Animal이라고 말할 수 있는 관계를 IS-A관계라 한다.
Animal dog = new Dog(); // 자식 클래스로 만든 객체는 부모 클래스의 자료형으로 사용할 수 있다.
//개로 만든 객체는 동물 자료형이다.
메소드 오버라이딩 (Method overriding)
- HouseDog 클래스에 Dog 클래스와 동일한 형태의 sleep 메소드를 구현하면 HouseDog 클래스의 sleep 메소드가 Dog 클래스의 sleep 메소드보다 더 높은 우선순위를 갖게 되어 HouseDog 클래스의 sleep 메소드가 호출되게 된다.
- 메소드 오버라이딩 : 부모클래스의 메소드를 자식클래스가 동일한 형태로 또다시 구현하는 행위
public class HouseDog extends Dog{
public void sleep() {
System.out.println(this.name+" zzz in house");
}
public static void main(String[] args) {
HouseDog houseDog = new HouseDog();
houseDog.setName("happy");
houseDog.sleep(); //happy zzz in house
}
메소드 오버로딩 (method overloading)
- 입력항목이 다른 경우 동일한 이름의 메소드를 만들 수 있다.
- 성립하기 위한 조건
- 메소드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 반환 타입은 영향 없다.
public class HouseDog extends Dog{
public void sleep(int hour) {
System.out.println(this.name+" zzz in house for "+hour+" hours");
}
public static void main(String[] args) {
HouseDog houseDog = new HouseDog();
houseDog.setName("happy");
houseDog.sleep(); //happy zzz in house
houseDog.sleep(3); //happy zzz in house for 3 hours
}
}
- 다중 상속은 자바에서는 지원 X
생성자
- 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메소드
- 이름이 클래스 이름과 같아야 한다.
- 리턴값이 없다.
public class HouseDog extends Dog{
public void sleep(int hour) {
System.out.println(this.name+" zzz in house for "+hour+" hours");
}
public static void main(String[] args) {
HouseDog dog = new HouseDog();
System.out.println(dog.name); //null
}
}
- 생성자(Constructor): 메소드명이 클래스명과 동일하고 리턴 자료형을 정의하지 않는 메소드
public class HouseDog extends Dog{
public HouseDog(String name) {
this.setName(name);
}
public void sleep(int hour) {
System.out.println(this.name+" zzz in house for "+hour+" hours");
}
public static void main(String[] args) {
HouseDog dog = new HouseDog("happy"); // new 키워드로 객체를 만들때 문자열을 전달해야만 한다.
System.out.println(dog.name); //happy
}
}
생성자 오버로딩
- 하나의 클래스에 여러개의 입력항목이 다른 생성자를 만들 수 있다. (Overloading)
public class HouseDog extends Dog{
public HouseDog(String name) {
this.setName(name);
}
public HouseDog(int type) {
if (type == 1) {
this.setName("yorkshire");
} else if (type == 2) {
this.setName("bulldog");
}
}
public void sleep() {
System.out.println(this.name+" zzz in house");
}
public void sleep(int hour) {
System.out.println(this.name+" zzz in house for "+hour+" hours");
}
public static void main(String[] args) {
HouseDog happy = new HouseDog("happy"); // 문자열로 생성
HouseDog yorkshire = new HouseDog(1); // 숫자값으로 생성
System.out.println(happy.name); //happy
System.out.println(yorkshire.name); //yorkshire
}
}
인터페이스
- 동물 사육사의 일을 정리
난 동물원의 사육사이다.
육식동물이 들어오면 난 먹이를 던져준다.
호랑이가 오면 사과를 던져준다.
사자가 오면 바나나를 던져준다.
// Animal.java
public class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
// Tiger.java
public class Tiger extends Animal{
}
// Lion.java
public class Lion extends Animal{
}
// ZooKeeper.java
public class ZooKeeper {
public void feed(Tiger tiger) {
System.out.println("feed apple");
}
public void feed(Lion lion) {
System.out.println("feed banana");
}
public static void main(String[] args) {
ZooKeeper zooKeeper = new ZooKeeper();
Tiger tiger = new Tiger();
Lion lion = new Lion();
zooKeeper.feed(tiger); //feed apple
zooKeeper.feed(lion); //feed banana
}
}
-> 만약 다른 동물들이 더 늘어나고 관리해야 한다면? => 인터페이스로 해결하기!
// Predator.java
public interface Predator {
}
// Tiger.java
public class Tiger extends Animal implements Predator {
}
// Lion.java
public class Lion extends Animal implements Predator {
}
// Crocodile.java
public class Crocodile implements Predator {
}
// ZooKeeper.java
public class ZooKeeper {
public void feed(Predator predator) {
System.out.println("feed apple");
}
public static void main(String[] args) {
ZooKeeper zooKeeper = new ZooKeeper();
Tiger tiger = new Tiger();
Lion lion = new Lion();
Crocodile crocodile = new Crocodile();
zooKeeper.feed(tiger); //feed apple
zooKeeper.feed(lion); //feed apple
zooKeeper.feed(crocodile); //feed apple
}
}
인터페이스의 메소드
- feed apple만 출력되는 문제 발생 -> 메소드를 이용하여 고쳐본다.
// Predator.java
public interface Predator {
public String getFood();
}
// Tiger.java
public class Tiger extends Animal implements Predator {
public String getFood() {
return "apple";
}
}
// Lion.java
public class Lion extends Animal implements Predator {
public String getFood() {
return "banana";
}
}
// ZooKeeper.java
public class ZooKeeper {
public void feed(Predator predator) {
System.out.println("feed "+predator.getFood());
}
public static void main(String[] args) {
ZooKeeper zooKeeper = new ZooKeeper();
Tiger tiger = new Tiger();
Lion lion = new Lion();
zooKeeper.feed(tiger); //feed apple
zooKeeper.feed(lion); //feed banana
}
}
다향성
instanceof
: 객체가 특정 클래스의 객체인지를 조사할 때 사용되는 자바의 내장 명령어animal instanceof Tiger
는 animal 객체가 new Tiger로 만드어진 객체인가?
- 다형성(Polymorphism) : 하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것
// Tiger 클래스의 객체 예시
Tiger tiger = new Tiger(); // Tiger is Tiger
Animal animal = new Tiger(); // Tiger is Animal
Predator predator = new Tiger(); // Tiger is Predator
Barkable barkable = new Tiger(); // Tiger is Barkable
// Bouncer.java
public class Bouncer {
public void barkAnimal(Animal animal) {
if (animal instanceof Tiger) {
System.out.println("어흥");
} else if (animal instanceof Lion) {
System.out.println("으르렁");
}
}
public static void main(String[] args) {
Tiger tiger = new Tiger();
Lion lion = new Lion();
Bouncer bouncer = new Bouncer();
bouncer.barkAnimal(tiger); //어흥
bouncer.barkAnimal(lion); //으르렁
}
}
- 하지만 이와 같은 방법은 동물 객체가 추가될때마다 추가로 생성해줘야 한다. => 인터페이스로 해결!
// Barkable.java
public interface Barkable {
public void bark();
}
// Tiger.java
public class Tiger extends Animal implements Predator, Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥")
}
}
// Lion.java
public class Lion extends Animal implements Predator, Barkable {
public String getFood() {
return "banana";
}
public void bark() {
System.out.println("으르렁")
}
}
추상클래스
- 추상클래스(Abstract Class) : 인터페이스 + 메소드
- abstract 클래스를 상속하는 클래스에서 해당 abstract 메소드를 구현해야만 한다.
// Tiger.java
public class Tiger extends Predator implements Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥");
}
}
public class Lion extends Predator implements Barkable {
public String getFood() {
return "banana";
}
public void bark() {
System.out.println("으르렁")
}
}
댓글남기기