Item14

Comparable을 구현할지 고려하라

  • 유일무이한 메서드인 compareTo
  • compareTo()는 단순 동치성 비교에 더해 순서까지 비교할 수 있으며 제네릭 합니다.
    public interface Comparable<T> {
      int compareTo(T t);
    }


compareTo() 일반규약

  • 이 객체와 주어진 객체의 순서를 비교합니다.
  • 이 객체가 주어진 객체보다 작으면 음수를, 같으면 0을, 크면 양수를 반환합니다.
  • 이 객체와 비교할 수 없는 타입의 객체가 주어지면 ClassCastException을 던집니다.
  • x.compareTo(y) = y.compareTo(x) * -1 입니다. 또한 예외가 발생한다면 양쪽 표현식 모두 발생합니다.
  • 추이성을 보장합니다.
    • x.compareTo(y) > 0이고 y.compareTo(z)이면 x.compareTo(z) > 0도 성립합니다.
  • (x.compareTo(y) == 0) == (x.equals(y)) 이어야 합니다.
    • 이 권고를 지키지 않는 모든 클래스는 아래의 사실을 명시해야 합니다
    • "이 클래스의 순서는 equals 메서드와 일관되지 않다"
    • Collection, Set, Map 인터페이스들은 동치성을 비교할 때 equals 대신 compareTo를 사용하기 때문에 마지막 규약을 꼭 지키는 것이 좋습니다.

사용예제

  • 기본 타입 필드가 여럿일 때의 비교자

    public int compareTo(PhoneNumber pn) {
      int result = Short.compare(this.areaCode, pn.areaCode);
      if(result == 0) {
          result = Short.compare(this.prefix, pn.prefix);
          if(result == 0) {
              result = Short.compare(line Num, pn.lineNum);
          }
      }
      return result;
    }
  • 정적 compare 메서드를 활용한 비교자

    static Comparator<Object> hashCodeOrder = new Comparator<>() {
      public int compare(Object o1, Object o2) {
          return Integer.compare(o1.hashCode(), o2.hashCode());
      } 
    }
  • 비교자 생성 메서드를 활용한 비교자

    static Comparator<Object> hashCodeOrder = Comparator.comparingInt(o -> o.hashCode());


결론

  • 순서를 고려해야 하는 값 클래스를 작성할 경우 꼭 Comparable 인터페이스를 구현합니다.
  • 그 인스턴스들은 쉽게 정렬하고, 검색하고, 비교 기능을 제공하는 컬렉션과 어우러져야 합니다.
  • compareTo()는 필드의 값을 비교할 때 '<'와 '>' 연산자는 쓰지 말도록 합니다.
  • 대신 박싱된 기본 타입 클래스가 제공하는 정적 compare 메서드나 Comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용합니다.

참조

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


  이번 포스팅에선 AWS 가성서버인 EC2에 대하여 알아보고, 인스턴스 생성, 접속, 관리 등 기본적인 운영에 대하여 알아보도록 하겠습니다.




EC2란?

 


  EC2란 Amazone Elastic Compute Cloud의 약자로 아마존에서 제공하는 인터넷에 연결된 가상 서버를 의미합니다. 또한, AWS 제품군 중에서 가장 널리 쓰이는 인프라이며 기본이 되는 인스턴스로 EC2만의 장점과 특성이 있습니다. 


 EC2는 가상 서버이기 때문에 클릭 몇번으로 쉽게 서버를 구축할 수 있다는 장점이 있습니다. 또한, 사용한 만큼만 요금을 지불하면 되므로 비용 절감의 효과도 누릴 수 있습니다. EC2 인스턴스튼 우리가 일반적으로 보는 PC나 서버와 똑같은 형태이며 Linux나 Windows가 설치 되어 있습니다. 하지만, 가상 서버이기 때문에 모니터에 직접 연결할 수는 없고 터미널이나 원격 데스크탑 연결로 접속을 해야 합니다.


* EC2 기본 개념


- 시작 : EC2 인스턴스를 시작합니다. 운영체제가 부팅되고 사용할 수 있습니다. 시작하는 순간부터 요금이 과금되며 1시간 단위로 요금으로 책정됩니다.

- 정지 : EC2 인스턴스를 정지합니다. 운영체제를 종료해 시스템이 종료된 상태이며 요금이 과금되지 않습니다.

- 삭제 : EC2 인스턴스를 삭제합니다. 삭제가 된 후 시간이 지나면 EC2 목록에서 사라집니다.

- 재부팅 : EC2 인스턴스를 재시작합니다.




EC2 인스턴스 생성하기

 


 다음으로 아마존 가성 서버를 생성 해보도록 하겠습니다. 순서는 아래와 같이 진행하며, 프리티어 (무료 요금제) 기준으로 설명 하도록 하겠습니다.


- 리전선택

- 유형선택

- 보안그룹 적용

- 키생성

- EC2 접속해보기

- EIP 할당


* 리전 선택




먼저, 상단의 리전(지역)을 선택 해주어야 합니다. 간혹, 미국 버지니아가 선택된 경우가 있는데 서울을 선택하여 주세요!! 거리에 따라 속도가 다르니 한국에서 운영/테스트 한다면 한국 리전을 선택해주시면 됩니다. 서울이 선택되었다면 인스턴스 시작 버튼을 눌러주세요!



* Image 선택



인스턴스에 사용될 이미지를 선택합니다. 리눅스, 윈도우 등의 운영체제를 제공합니다. 여기서는 Amazone Linux를 선택합니다. (아마존 리눅스는 CentOS 계열입니다)


* 유형 선택




다음으로, 인스턴스 유형을 선택해야 합니다. 인스턴스는 가상 서버의 cpu수, 메모리에 따라 요금이 다릅니다. 이 부분은 우선 프리티어(무료)를 선택하도록 하겠습니다. (접속자 수, 네트워크 유입량  등에 따라, 유형을 선택하면 됩니다)



* 인스턴스 구성




서브넷과 가용 영역을 선택하는 부분입니다. 이 부분은 VPC를 알아야 값을 선택할 수 있습니다. 여기서는 기본 선택값 그대로 유지하도록 하겠습니다.



* 스토리지 추가



EC2의 용량을 선택할 수 있습니다. 일반적으로 EC2의 용량을 낮게 잡고, 파일 서버를 S3를 추가하여 사용합니다. 프리티어의 경우 30GB 까지 무료로 제공하니 30GB를 선택하여 주세요



* 태그 추가



 AWS에서는 여러 태그가 있습니다. 태그는 키/VALUE의 쌍으로 구성됩니다. 여기서는 Name과 ClientName 두개만 사용하도록 하겠습니다. Name은 인스턴스의 이름을 주는 것이고, ClientName으로 요금 청구시 항목을 구별해주는 값입니다.



* 보안 그룹 구성



 AWS에서는 보안 그룹이라는 서비스를 제공합니다. in/out bound의 port를 관리하는 것입니다. 여기에서는 22, 80, 443의 포트만 허용하도록 하겠습니다. 또한, 보안상의 문제로 22(ssh) 터미널 접속 포트만 내 IP/회사 IP만 추가 해주시기 바랍니다.



* 키 생성 & 인스턴스 시작


 AWS에서는 EC2에 접속하기 위해서는 키(pem) 파일이 필요합니다. '새 키페어 생성'을 하여 주시고, 키파일을 안전하게 보관하여 주시기 바랍니다. 외부로 유출될 경우 서버가 악용될 소지가 있으니, 키파일은 private한 저장소에 보관하는게 제일 좋습니다.


이제 인스턴스 시작 버튼을 누룬후 2~3분이 지나면 새로운 인스턴스가 생성됩니다!!



* SSH 접속



 

 인스턴스가 생성 되었다면 목록에서 '실행중' 이라는 것을 볼 수 있습니다. 마우스 오른쪽을 클릭하여 '연결' 버튼을 눌러주세요!




* SSH 접속



맥 기준으로, 이전에 생성한 키파일(pem)파일의 권한을 수정하여 줍니다. chmod 400 '키파일'

다음으로 터미널을 이용하여 가상 서버에 접속하여 줍니다. ssh -i '키파일' ec2-user@ip


ip의 경우 ec2-172-12-33-6 이런식으로 시작하는 숫자를 똑같이 입력하여 주면 됩니다!! 

다만 22번 포트의 접속 권한을 내 IP로 지정하였기 때문에, 해당 IP 대역에서만 터미널에 접속할 수 있습니다.



* EIP 설정



위에서 터미널 접속시 꽤 긴 ip를 이용하여 가상 서버에 접근하였습니다. 이러한 문제를 공인 IP를 할당하여 해결할 수 있습니다.

왼쪽 목록에서 탄력적IP를 눌러주세요. 다음으로 탄력적 IP 주소 할당 -> 탄력적 IP 주소 연결을 하게 되면

 ssh -i '키파일' ec2-user@EIP를 이용하여 쉽게 가상 서버에 접근할 수 있습니다. 다만, EIP를 할당 받은 후에 인스턴스에 매칭하여 주지 않으면 과금되니 주의하시기 바랍니다.


EIP 해제 방법

: EIP 주소 연결 해제 -> EIP 주소 릴리즈




출처


[aws] https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html


다음 포스팅에선 AWS의 파일 서버인 S3에 대해서 포스팅 하도록 하겠습니다!

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며


 이전 포스팅까지는 자바의 기초문법에 대하여 정의하였습니다. 기본적인 문법구조나 변수 선언등에 대해서 알아보았고, 이번 포스팅에선 자바의 가장 두드러지는 특징인 객체지향의 대하여 알아보도록 하겠습니다.


객체지향의 개념


 객체지향이란 컴퓨터 프로그래밍 패러다임중의 한 종류입니다. 기존 명령어를 중심으로 나열하는 프로그래밍기법에서 벗어나, 객체 모델을 바탕으로 프로그램을 구체화하고 개발하는 프로그래밍 기법을 의미합니다. 객체지향의 특징에는 상속, 추상화, 다형, 추상화 이라는 특징이 있습니다.

 위에 언급된 특성은 객체지향의 핵심적인 특징으로 꼭 이해하시고 가야 합니다. 객체지향의 특징을 설명하기 전에 클래스, 객체, 인스턴스를 짚고 넘어가도록 하겠습니다.


  • 클래스

멤버변수와 함수로 구성된 논리적인 설계도


class Student {

private String name;

private int age;

}


  • 객체

클래스에 선언된 모응 그대로 생성된 실체


public class Main {

public static void main(String[] args) {

Student student;

}

}


  • 인스턴스

생성되어진 객체가 메모리에 올려진 것


public class Main {

public static void main(String[] args) {

Student student = new Student();

}

}


객체와 인스턴스는 일반적으로는 통용하여 표현하나, 메모리에 올려진 여부로 객체와 인스턴스를 판단합니다.



객체지향의 특징


 객체지향에는 다음과 같은 특징이 있습니다. 캡슐화, 상속, 다형성, 추상화 모두 중요한 개념입니다. 


  • 캡슐화

 캡슐화는 생성한 객체를 어떤 메서드와 필드로 어떻게 일을 수행할지 외부에 숨기는 특성을 말합니다. 캡슐화 은닉화 라고 하며 보호하고자 하는 데이터의 값을 외부에서 직접 접근하는 것을 방지하기 위해 나온 개념입니다. 접근제어자를 이용하여 값을 은닉하고, public method로 값을 통제합니다.


캡슐화 예제

 class Student {
private String name;
private int age;

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge() {
this.age = age;
}
}


public class Main {

public static void main(String[] args) {

Student student = new Student();


student.setName("윤호");

student.setAge(20);


System.out.println("학생의 이름 : " + student.getName());

System.out.println("학생의 나이 : " + student.getAge());

}

}


  • 상속

 클래스는 추상화된 슈퍼클래스와 구체화된 서브 클래스로 구성됩니다. 예를 들면 사람(슈퍼클래스)와 학생(서브클래스)
 지정 예약어 extends를 이용하여 상속을 이용합니다. 하나의 부모클래스는 여러 자식을 가질 수 있지만, 반대는 성립하지 않습니다.
 자식은 부모의 값이나 행위를 상속받아 사용할 수 있습니다. 

상속 예제

class Person {
private String name;
private int age;

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge() {
this.age = age;
}

public void run() {
System.out.println("달리기를 합니다");
}
}

class Student extends Person() {
public void study() {
System.out.println("공부를 합니다");
}
}


public class Main {

public static void main(String[] args) {

Student student = new Student();


student.setName("윤호");

student.setAge(20);


System.out.println("학생의 이름 : " + student.getName());

System.out.println("학생의 나이 : " + student.getAge());


student.run();

student.study();

}

}


  • 다형성

 클래스의 상속 관계를 이용하여 슈퍼클래스가 같은 서브 클래스의 동일한 요청을 다르게 처리할 수 있는 특징을 말합니다. 예를 들어, 사람이라는 클래스가 있고 아침에 이동하다는 행위를 합니다. 사람을 상속받은 학생클래스는 아침에 학교로 이동하고, 사람을 상속박은 직장인 클래스는 아침에 회사로 이동합니다. 아래 예제를 보도록 하겠습니다.

다형성 예제


class Person {
public void move() {
System.out.println("이동합니다");
}
}

class Student extends Person() {
@Override
public void move() {
System.out.println("학교로 이동합니다");
}
}

class Student extends Worker() {
@Override
public void move() {
System.out.println("일터로 이동합니다");
}
}

public class Main {

public static void main(String[] args) {

Student student = new Student();

Worker worker = new Worker();


student.move();

worker.move();

}

}


  • 추상화

 매우 중요한 개념입니다. 객체의 공통된 특징을 묶어서 추출한다는 개념인데, 다음 포스팅에서 클래스에 대하여 설명하며 추상클래스, 인터페이스와 함께 덧붙이도록 하겠습니다.


정리

 

 이번 포스팅에선 자바의 핵심 개념인 객체지향에 대하여 글을 작성하였습니다. 자바는 프로그램을 구조화하는 특징을 가졌으며 추상화, 상속, 캡슐화, 다형성라는 중요한 특성이 있습니다. 이러한 기능으로 구조적으로 재활용성이 높아져 생산성이나 유지보수 효율성을 높인 프로그래밍 언어입니다!!


출처


- 자바의 정석

- just 자바

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

java8 설치하기

이번 포스팅에선 아마존 EC2 인스턴스에 java를 설치해보겠습니다.

리눅스는 CentOS, Ubuntu 등 미세하게 차이가 나니 참고하여 설치하시기 바랍니다.

저의 경우에는 'Amazone Linux'를 설치하였습니다.

먼저, 설치된 자바 버전을 확인하여 줍니다. 아마존 리눅스는 기본적으로 1.7 버전이 설치되어 있지만

1.8 버전을 설치하기 위해 1.7 버전을 삭제하여 줍니다.

1
2
java -version
sudo yum remove java-1.7.0-openjdk
cs

다음으로, 설치할 수 있는 자바 버전을 확인합니다.

주의) 라이센스 문제가 있을 수 있으니, 가급적 oracle jdk가 아닌 openjdk로 설치하여 줍니다.

또한, 자바버전은 아직까지 java8을 많이 사용하고 있는데, application의 java version정보를 참고하여 설치하면 됩니다.

1
2
sudo yum list | grep java-
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
cs

여러 가지 버전이 나오지만, java-1.8.0-openjdk-devel.x86_64 버전을 설치하여 줍니다. 

그 이유는 javac 때문인데요, 일반 버전으로 설치하니 javac가 설치가 안 되었더군요. 

이유를 찾아보니 '컴파일러를 포함하지 않는다~~'라고 합니다.

이제 자바가 잘 설치되었는지 java -version으로 확인합니다.

다음으로 환경변수를 설정하기 위해 profile 파일을 바꿔 줘야 합니다.

먼저 root로 계정을 전환하여 줍니다.

echo를 이용하여 환경변수를 확인해 봅니다.

다음으로 절대 경로를 구하여 복사하여 줍니다.

1
2
3
4
5
6
7
8
9
echo $JAVA_HOME
which javac
##/usr/bin/javac
readlink -/usr/bin/javac
##/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.42.amzn1.x86_64/bin/javac
 
 
## 복사하여 줍니다
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.42.amzn1.x86_64
cs



1
2
sudo vim /etc/profile
source /etc/profile
cs


vim을 이용하여 환경변수를 넣어줍니다.

저장 후에 리눅스를 재부팅 하여 줍니다.

다음 명령어를 이용하여 자바 환경 변수가 잘 등록되었는지 확인합니다.

1
2
echo $JAVA_HOME
$JAVA_HOME/bin/javac -version
cs



다음 포스팅에선 톰캣 설치를 알아보겠습니다.


[출처]

https://jojoldu.tistory.com/261

https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_$JAVA_HOME_%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98_%EC%84%A4%EC%A0%95

https://stackoverflow.com/questions/24641536/how-to-set-java-home-in-linux-for-all-users





블로그 이미지

사용자 yhmane

댓글을 달아 주세요

개요

이번 포스팅에선 하나의 AMI를 선택하여 EC2 인스턴스를 생성해보도록 하겠습니다.

AMI란 Amazone Machine Image의 줄임말입니다.


aws, azure 등 클라우드의 최대 장점은 마우스 클릭 몇번만으로  원하는 서버 환경을 구성할 수 있습니다.

리눅스 종류, 메모리, 용량 등을 선택할 수 있고, 이번 포스팅에서는 프리티어 기준으로 설명하도록 하겠습니다.

(프리티어를 이용해 무료로 1년 호스팅을 할 수 있지만, 아쉽게도 제약사항이 많이 있습니다 .. 개인적으로 메모리는 조금 늘려주었으면 하네요 ㅠㅠ)

생성하기

먼저, 상단탭에서 서비스를 클릭 후, EC2를 눌러줍니다.

인스턴스 시작 버튼을 눌러줍니다.

Amazone Linux, Redhat, Ubuntu 등의 image가 보입니다. 여기서 Amazone Linux를 선택하여 줍니다.

이외에 자신이 원하는 것을 선택하여 줘도 됩니다.

보안 그룹에서 ssh이외에 http 프로토콜 규칙을 추가해줍니다.

검토를 끝내고 시작을 눌러 줍니다.

시작을 누르면 키 등록 버튼이 나오는 데, 2가지로 접근이 가능합니다.


1) 기존키를 사용하겠다 (굳이 새로운 키를 만들 필요가 없다면)

2) 키를 생성하겠다(키 페어 생성)

만약, 2번을 선택하였다면 키페어의 이름을 지어주고 다운로드 해줍니다!!! (키가 있어야 shell에 접근 가능합니다!!, 그리고 key는 안전하게 잘 보관하는 것이 중요!!)

이런식으로 자신의 로컬에 perm 파일을 다운로드 받아 관리하여 줍니다.

key가 없으면 곤란해지는 상황이 발생합니다 !! 꼭 잘 보관해줍시다!!


이제, 2-3분이 지나면 ec2 인스턴스가 생성된 것을 확인할 수 있습니다. 

이제 오른쪽 마우스를 클릭하여 연결 버튼을 눌러줍니다.

이제 CLI(command line interface)로 접근할 수 있는 방법을 알려주는 데요

window의 경우 putty, git shell / mac의 경우 terminal 등의 프로그램으로 서버에 접속할 수 있습니다.


1) 먼저, key의 권한을 바꿔줍니다 chmod 400 ~

2) 다음으로 ssh 접속을 하여 줍니다. ssh -i ~

위의 명령어를 입력하면 서버에 접속한 것을 확인할 수 있습니다.

빨간 부분은 제 고정 ip이기 때문에 가렸습니다. 13.125.242.46의 경우는 정지 했다가 재시작하면 다시 주어지는 유동 ip입니다.


블로그 이미지

사용자 yhmane

댓글을 달아 주세요