ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바를 시작해보자
    언어/Java 2023. 6. 26. 21:44
    728x90
    반응형
    SMALL

    자바 프로그래밍의 특징

    • 플랫폼에 영향을 받지 않으므로 다양한 환경에서 사용할 수 있다.
    • 객체 지향 언어이기 때문에 유지보수가 쉽고 확장성이 좋다
    • 프로그램이 안정적이다
    • 풍부한 기능이 제공되는 오픈 소스이다.

    객체 지향 프로그래밍

    • 프로램의 구현을 시간의 흐름 순이 아닌 객체간의 협력을 기반으로 프로그램 하는 것
    • OOP(Object Oriented Programming)이라고 한다

    용어

    JDK (JAVA Development Kit) : 자바에서 제공되는 개발용 라이브러리

    JRE (JAVA Runtime Environment) : 자바 프로그램 실행 환경

    JVM (Java Virtual Machine) : 자바 가상 머신으로 프로그램이 실행되는 환경인 JRE가 설치되어 있어야 한다

    객체

    • 의사나 행위가 미치는 대상
    • 구체적, 추상적 데이터의 단위

    OOP 순서

    • 객체 정의
    • 객체의 속성은 멤버 변수와 메서드로 구현
    • 객체간의 협력을 구현

     

     

     

    클래스

    • 대문자로 시작하는 것이 좋음
    • java 파일 하나에 클래스는 여러 개가 있을 수 있지만, public 클래스는 하나이고 public 클래스 이름과 .java 파일의 이름은 동일

    메서드

    • 객체의 기능을 구현하기 위해 클래스 내부에 구현된 함수
    • 멤버 함수라고도 함
    • 메서드를 구현함으로써 객체의 기능이 구현됨
    • 클래스 이름에 맞춰 명명하는 것이 좋음

    → 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현

    인스턴스

    • 클래스는 객체의 속성을 정의하고 기능을 구현한 코드
    • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각기 다른 멤버 변수 값을 가지게 된다
    • new() 키워드를 통해 인스턴스 생성

    힙 메모리

    • 생성된 인스턴스는 동적 메모리에 할당됨
    • 자바에서는 Garbage Collector가 주기적으로 사용하지 않는 메모리를 수거
    • 하나의 클래스로부터 여러 개의 인스턴스가 생성될 경우 각기 다른 메모리 주소를 가지게 된다
    객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
    
    클래스 : 객체를 정의하기 위한 코드 상태
    
    인스턴스 : new 키워드를 통해 클래스를 메모리에 적재한 상태
    
    멤버 변수 : 클래스의 속성, 특성
    
    메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
    
    참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
    
    참조 값 : 생성된 인스턴스의 메모리 주소 값

     

     

     

    생성자

    • 생성자 기본 문법 <class\_name>(\[<argument\_list\]){<statements\]}
    • 객체를 생성할 때 new 키워드와 함께 사용 - new 생성자();
    • 생성자는 일반 함수처럼 기능을 호출하는 것이 아님, 객체를 생성하기 위해 new와 함께 호출됨
    • 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출
    • 생성자는 반환 값이 없고, 클래스의 이름과 동일
    • 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private으로 선언될 수 있따.

    기본 생성자

    • 클래스에는 반드시 하나 이상의 생성자가 존재
    • 클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있따.
    • 클래스에 생성자가 없어도 컴파일러가 자동으로 생성자 코드를 넣어줌
    • 매개 변수와 구현부가 없음
    • public 클래스명(){}

    생성자 오버로딩

    • 생성자를 따로 정의하여 사용할 수 있음
    • 클래스에 생성자를 따로 구현하면 기본 생성자는 제공되지 않음
    • 여러 생성자를 정의해두고 필요에 따라 원하는 생성자를 호출해서 사용할 수 있음
    public class UserInfo {
    
        public String userId;
        public String userPassWord;
        public String userName;
        public String userAddress;
        public String phoneNumber;
    
        public UserInfo(){}
    
        public UserInfo(String userId, String userPassWord, String userName) {
            this.userId = userId;
            this.userPassWord = userPassWord;
            this.userName = userName;
        }
    
        public String showUserInfo() {
            return "고객님의 아이디는 " + userId + "이고, 등록된 이름은 " + userName + "입니다."; 
        }
    }
    public class UserInfoTest {
    
        public static void main(String[] args) {
    
            UserInfo userLee = new UserInfo();
            userLee.userId = "a12345";
            userLee.userPassWord = "zxcvbn12345";
            userLee.userName = "Lee";
            userLee.phoneNumber = "01034556699";
            userLee.userAddress = "Seoul, Korea";
    
            System.out.println(userLee.showUserInfo());
    
            UserInfo userKim = new UserInfo("b12345", "09876mnbvc", "Kim");
            System.out.println(userKim.showUserInfo());
        }
    }

     

     

     

    변수의 자료형

    • 기본 자료형 : int, double, float, double
    • 참조 자료형 : String, Date, Student
    • 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
    • 참조 자료형을 사용할 때는 해당 변수에 대해 생성해야 함 (String은 예외)

     

     

     

    접근 제어 지시자

    • 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자에 접근 정도를 구분하는 키워드
    • private : 같은 클래스 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스에서도 접근 불가)
    • 아무 것도 없는 경우(default) : 같은 패키지 내부에서만 접근 가능 (상송 관계라도 패키지 다르면 접근 불가)
    • protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외에서는 접근 불가
    • public : 어디서든 접근 가능

     

     

     

    get / set

    • private으로 선언된 멤버 변수에 접근, 수정할 수 있는 메서드를 public으로 제공
    • get()의 경우 read-only
    • private으로 제어한 멤버 변수를 Public 메서드를 통해 접근 가능하지만 변수가 public으로 제공되었을 때보다 private일 때 변수에 대한 제한을 public 메서드에서 제어할 수 있다.
    public void setMonth(int month) {
            if ( month < 1 || month > 12) {
                isValid = false;
            } else {
                this.month = month;
            }
    }

     

     

     

    캡슐화

    • 꼭 필요한 정보와 기능만 외부에 오픈
    • 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만 제공하여 일관된 기능을 구현
    • 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화

     

     

     

    this

    • 인스턴스 자신의 메모리를 가리킴
    • 생성자에서 또 다른 생성자를 호출할 때 사용
    • 자신의 주소(참조값)를 반환 함
    • 클래스의 생성자가 여러 개일 경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음
    • 생성자에서 다른 생성자를 호출할 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음
    public class Person {
        String name;
        int age;
    
        public Person() {
            this("이름없음", 1);
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

     

     

     

    협력

    • 객체 지향 프로그래밍은 객체들간의 협력으로 이루어짐
    • 협력을 위해서는 필요한 메시지를 전송하고 이를 처리하는 기능이 구현되어야 한다
    • 매개 변수로 객체가 전달되는 경우가 발생

     

     

     

    static 변수

    • 여러 인스턴스가 공유하는 기준 값이 필요한 경우
    • 인스턴스가 생성될 때 만들어지는 변수가 아니라, 처음 프로그램이 메모리에 로딩될 때 메모리에 할당됨
    • 클래스 변수, 정적 변수라고 한다
    • 인스턴스 생성과 상관 없이 사용가능하므로 클래스 이름으로 직접 참조 가능

    static 메서드

    • static 변수를 private으로 선언, getter/setter 구현
    • static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출될 수 있음
    • 인스턴스 생성 전에 호출될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음
    • static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않다
    • 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
    • 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨

    싱글톤 패턴

    • 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
    • static 변수, 메서드를 활용하여 구현할 수 있음

    1. 생성자는 private으로 선언

    private Company(){}

    2. 클래스 내부에 유일한 private 인스턴스 생성

    private static Company instance = new Company();

    3. 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공

    public static Company getInstance(){
        if(instance==null){
            instance = new Company();
        }
    
        return instance;
    }

     

     

     

    배열 선언

    int[] arr1 = new int[10];
    int arr2[] = new int[10];
    • 배열은 선언과 동시에 자료형에 따라 초기화 됨 (정수는 0, 실수는 0.0, 객체는 null)
    • 필요에 따라 초기값을 지정할 수 있다
    int[] numbers = new int[] {10,20,30}; // 개수 생략해야 함
    int[] numbers = {10, 20, 30}; // new int[] 생략 가능
    
    int[] ids;
    ids = new int[] {10, 20, 30}; // 선언 후 배열을 생성하는 경우는 new int[] 생략 불가

    객체 배열

    • 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈 메모리만 할당되고 각 요소 객체는 생성하여 저장해야 함

    객체 복사

    • 얕은 복사
      • 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨
      • 두 배열이 같은 객체 배열을 가리키게 된다
    • 깊은 복사
      • 각각의 객체를 생성하여 그 객체의 값을 복사해 배열이 서로 다른 객체를 가리키도록 함

    arrayList

    • java.util 패키지에서 제공된다
    • 기존의 배열 선언과 사용 방식은 배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면 배열을 재할당하고 복사해야 했음
    • 배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에 대한 구현을 해야 함
    • ArrayList는 객체 배열을 좀 더 효율적으로 관리하기 위해 자바에서 제공해주는 클래스
    • 이미 많은 메서드들이 최적의 알고리즘으로 구현되어 있어 각 메서드의 사용 방법만 익히면 유용하게 사용할 수 있음

    메서드

    • boolan add(E e) : 요소 하나를 배열에 추가, E는 요소의 자료형을 의미
    • int size() : 배열에 추가된 요소 전체 개수를 반환
    • E get(int index) : 배열의 index 위치에 있는 요소 값을 반환
    • E remove(int index) : 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환
    • boolean isEmpty() : 배열이 비어 있는지 확인
    반응형
    LIST

    댓글

Designed by Tistory.