자바 소스코드의 구조 및 객체지향이란?

Java

소스코드의 구조

자바 소스코드는 일반적으로 클래스명.java의 형태로 만들어진다. 소스코드의 가장 바깥쪽 영역은 class 블록이다. 클래스명은 원하는 이름으로 지을 수 있고, 클래스명은 소스파일의 이름과 동일하게 사용해야 한다.

가장 바깥쪽은 클래스 블록으로 중괄호 {}를 이용하여 영역을 표시한다. 클래스 블록 안에는 메서드 블록이 있으며, 메서드 블록 안에는 명령문이 있다.

public class Sample {
    public static void main(String[] args) {
        System.out.println("Hello java");
    }
}
명명 규칙

클래스의 이름은 CamelCase로 작성한다.

메서드의 이름은 여러 단어로 조합되는 경우 첫글자는 항상 소문자 이후의 단어는 대문자로 작성한다.

객체지향 프로그래밍

객체지향이 왜 필요할까 단순하게 생각해보면 같은 기능을 하는 클래스를 여러 개 만드는 방법은 비효율적이지만 객체를 이용하여 같은 기능은 하지만 서로 영향을 주지 않는 부하들을 만든다면 얼마나 편리할까

클래스를 과자 모양을 잡아주는 틀이라고 생각하면 객체는 이 틀에 의해 생기는 과자들이라 볼 수 있다.

객체 변수

클래스에 선언된 변수를 객체 변수라고 한다.

class a{
    string s;
}

class b{
    public static void main(String[] args){
        a aa=new a();
        aa.s;
    }
}

객체.객체변수로 접근할 수 있다.

메소드

클래스 내에 구현된 함수를 보통 메소드라고 말한다.

class Animal {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}

public class Sample {
    public static void main(String[] args) {
        Animal cat = new Animal();
        cat.setName("boby");  // 메소드 호출
        System.out.println(cat.name);
    }
}

또한 객체 변수는 공유되지 않는다. 즉 클래스에 같은 name이라는 변수가 있더라도 생성된 객체들 끼리는 객체 변수를 공유하지 않고, 서로의 고유한 변수 값을 가진다.

Call by value

값에 의한 호출은 함수가 호출될 때 메모리 공간 안에서는 임시의 공간이 생성되고 이 공간은 함수가 종료되면 사라진다. 즉 함수를 호출할 때 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다. 복사된 인자는 함수 안에서 지역적으로 사용하는 변수이다.

Call by reference

참조에 의한 호출은 메모리 공간 안에서 함수를 위한 별도의 임시 공간이 생성된다. 함수 안에서 인자의 값이 변경되면, 함수 호출시에 있던 변수들도 값이 바뀐다.

기본 자료형 : call by value로 동작한다. 참조 자료형 : call by reference로 동작한다.

상속

자식 클래스가 부모 클래스의 기능을 그대로 물려받을 수 있는 상속이라는 개념이 있다.

개는 동물이다. 이러한 관계를 자바에서는 IS-A관계라고 한다. 즉

Animal dog = new Dog();

이런식으로 코딩이 가능하다. 이 경우는 부모 클래스에 구현되어 있는 메소드만 사용이 가능하다. 반대의 선언은 불가능하다. 부모를 거스르는 일은 없기 때문이다.

메소드 오버라이딩

부모 클래스의 메소드를 자식 클래스가 동일한 형태로 구현하는 것을 메소드 오버라이딩이라고 한다.

메소드 오버로딩

동일한 이름의 메소드가 있지만 메소드의 입력항목이 다른 경우를 말한다.

다중 상속

클래스가 동시에 하나 이상의 클래스를 상속받는 것을 의미한다. 자바외에 다른 언어들은 다중 상속을 지원하는 경우가 많지만 자바의 경우 지원하지 않는다. 이는 애매모호한 부분이 생기는 것을 사전에 차단하고자 하는 창시자의 의지이다.

생성자

메소드명이 클래스명과 동일하고 리턴 자료형을 정의하지 않는 메소드를 생성자라고 한다. 생성자는 클래스명과 메소드명이 일치해야 하며, 리턴타입을 정의 하지 않는다.

생성자는 객체가 생성될 때 호출되며, 우리가 new 키워드를 사용할 때 호출된다.

인터페이스

인터페이스는 implements 키워드를 사용한다. 인터페이스안에 메소드를 추가하기 위해서는 implements한 클래스들이 구현할 수 있도록 몸통만 작성한다. 또한 인터페이스의 메소드는 항상 public으로 구현한다.

몸통을 구현할 수 없지만 디폴트 메서드를 사용하여 디폴트 메서드를 추가할 수 있다. 또한 이 디폴트 메서드는 오버라이딩이 가능하여 자기가 원하는데로 수정하여 메서드를 사용할 수 있다.

스태틱 메서드인터페이스명.스태틱메서드명과 같이 사용하여 일반 클래스의 스태틱 메서드를 사용하는 것과 동일하게 사용할 수 있다.

다형성

하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것을 의미한다.