いまさら聞けない「アノテーション」とは？

## はじめに
普段の業務でAndroid Java, C++ のソースコードをいじっているのですが、何となく見ている「アノテーション」。

そういやこれってどういう意味？っと思ったので調べてみました。

あと最近同期のエンジニアが、「アノテーション」を業務で作成したり、修正したりすることがあったらしく、めちゃくちゃ苦戦したらしいので調べてみよーっと思った経緯です。

アノテーションって、ただの「目印」「注釈」？くらいの認識です。
注釈つけておけば、他の人がソースを見たときに分かりやすくなるから、Javadocのような認識です。

それがどうやら違うらしいので、調べていきますー。

## あなたは誰？
失礼しましたｗ

お前は誰やねん！って思った方もいらっしゃる思うので簡単に自己紹介をさせていただきます。

> 現職：SESエンジニア(歴1年)
前職：営業
年齢：27歳
使用言語：Java, Android Java, C++
工程：テスト、実装(設計もやってみたい…)
好きなこと：サウナ/登山/ダーツ/酒/運動全般



## 結論

ただの「注釈」ではない。

Javaではアノテーションをプログラムに記述することにより、コンパイラで出力される警告メッセージを抑制したり、実行環境によってプログラムの動作を変更したりできます。

もうちょい砕けて書くと、
「わざとエラーを出力させたり、プログラムの動きを変えることができる。」です。

と言われてもイメージが付かないと思うので、
実際どのように使うのかを見ていきましょう。

## アノテーションを使うメリット

メリットは3つあります。

・**スペルミスをしたときにエラーを出せる**
・__メソッドやクラス名を間違えたときにエラーを出せる__
・**他のプログラマーに「ここはこういう風に書いて」と指示を出せる**

人であるがゆえに起こりえるミスを減らしてくれるってことですね！
単純なスペルミスなのに、本人は全く気が付かず他の原因をあれこれと探してしまうのはあるあるですよねー

## アノテーションの種類

代表的なのは3つです。

・**Override**
・**Deprecated**
・**SuppressWarnings**

見たことある人多いと思います。
私はOverrideはしょっちゅう見ますが、具体的にコイツが何をしてくれているのか理解しないまま作業しちゃっていましたｗ

では1つずつ見ていきましょう！


### Override
スーパークラスのメソッドをオーバーライドするという注釈
⇒ 単純なミスをすぐに見つけることができる

以下の簡単なコードを見てみましょう。
ちゃんとオーバーライドできているでしょうか・・・


```java
public class Test extends TestOverride {
　
           @Override
           public void outputs() {
                            System.out.println(“Hello World!”);
           }
　
           public static void main(String[] args) {
                      TestOverride cl = new TestOverride();
                      cl.output();
           }
}
　
public class TestOverride {
　
           public void output() {}
}


```
実行してみると・・・↓
```Java
Documents $ 1java test.java
test.java:3: エラー:メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
           @override
           ^
エラー1個
エラー:コンパイルが失敗しました
Documents $ 1

```
@Override がちゃんとできていないので、アノテーションがエラーを出して気づかせてくれます。
outputとすべきところを、outputsになっていますねｗ

このように、@Overrideを使うことによってメソッド名を書き間違えた場合にエラーを出せるため、プログラムのバグを減らせます。



### Deprecated
クラスやメソッドが非推奨であるという注釈
⇒ メソッドが書き換えられた際などに、「このメソッドやクラスは非推奨です」というエラーを出す。

以下のコード見てみましょう。

```Java
public class Test {

           public static void main(String[] args) {
                      new Test2().testMethod();
           }
}
　
class Test2 {
           @Deprecated
           public void testMethod(){}
}
```
実行結果↓


```Java
Documents $ 1java test.java
注意 :test.javaは推奨されないAPIを使用またはオーバーライドしています。
注意 :詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。
Documents $ 1
```
実行はされるけど、このメソッドはあんまり使わないでねーと注意が表示されます。
残しておきたいけど、今は使わないでーという意図で@Deprecatedを使うと認識しています。(違ったら指摘くださいｗ)


### SuppressWarnings
コンパイル時の警告を抑制するという注釈
⇒ 不要な警告が表示されないようにする、ジェネリックスがない場合とか

通常は良くない書き方をした場合に、コンパイル時にエラーが出て実行することができません。しかし、SuppressWarningsを使うと、強引に実行することができるのです。


以下のように()に前提値を入れることで、特定の警告が出ないようにします。
```Java
@SuppressWarnings(“cast”) // 不要なキャストをしている
@SuppressWarnings(“deprecation”) // 非推奨のメンバーを使用
@SuppressWarnings(“divzero”) // ゼロ除算をしている　例: 4 / 0
@SuppressWarnings(“unused”) //使っていない変数がある

```

本来エラーが出るべきところを、強制的に出なくするので
私のような新人はあまり使わないかもしれないですねｗ


## まとめ
以上の3つが代表的な標準アノテーションです。
アノテーションを適切に付与することによって、ソースコードの書き方を制限でき、余計なミスをなくすことができます。


## 参考資料
[Javaの「アノテーション」とは？使い方・作り方を解説](https://ec-orange.jp/ec-media/?p=17791)
[いまさらJavaのアノテーションを復習する](https://qiita.com/tkj06/items/a9fe1881dc965893a5f4)
[いまさら聞けない「Javadoc」と「アノテーション」入門](https://atmarkit.itmedia.co.jp/ait/articles/1105/19/news127.html)
[【5分でわかる】Springでよく使うアノテーション40選！ 基本からバリデーションまでまるっとご紹介](https://camp.trainocate.co.jp/magazine/spring-annotation/)
[標準アノテーション](https://java-code.jp/162)
[【初心者向け】Javaのアノテーションの使い方を解説！代表例から自作方法まで](https://www.tech-teacher.jp/blog/java-annotation/#:~:text=%E3%81%AE%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B-,%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF,%E3%81%AA%E3%81%93%E3%81%A8%E3%81%8C%E8%A1%8C%E3%81%88%E3%81%BE%E3%81%99%E3%80%82)


## おわりに
普段何気なく見ているアノテーションについて調べてみました。
まだ実務では直接的にアノテーションに触れていないのでイメージできる範囲でまとめてみました。

代表的な3つのアノテーション以外にもたくさんありますが、今回は触れずに終わりますｗ
Javaエンジニアとして、Spring Bootでよく使うアノテーションについては、今後時間を取って調査していきたいです。

最後まで読んでいただきありがとうございました！
良かったらLGTMお願いします。